#include <type_traits>
template<typename T>
using Ref1 = T & ;
template<typename T>
using Ref2 = std::add_lvalue_reference_t<T>;
template<typename T>
void f1(Ref1<T>)
{}
template<typename T>
void f2(Ref2<T>)
{}
int main()
{
int n{};
f1(n); // ok
f2(n); // error
}
我的编译器是clang 7.0,使用
c++17
编译。错误消息是:error : no matching function for call to 'f2'
note: candidate template ignored:
couldn't infer template argument 'T'
为什么
f1
可以,但是f2
不可以? 最佳答案
std::add_lvalue_reference_t<T>
定义为typename std::add_lvalue_reference<T>::type
,然后对于template<typename T> void f2(Ref2<T>)
,即template<typename T> void f2(typename std::add_lvalue_reference<T>::type)
,它属于non-deduced context,这导致模板参数推导失败。
关于c++ - 为什么std::add_lvalue_reference的行为不符合预期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53679047/