C++ 右值引用模板推导 模板 无效f(U&v) { std::cout
不,不是真的。右值引用永远不会被推导。概念C++ 右值引用模板推导 模板 无效f(U&v) { std::cout,c++,templates,rvalue-reference,C++,Templates,Rvalue Reference,不,不是真的。右值引用永远不会被推导。概念U&,其中U是一个可推导的模板参数,用于指示应推导U,以便保留参数的右值: 当传递类型为X的右值时,U的类型变为X 当传递类型为X的cv限定左值时,U成为类型X cv& 更有趣的问题是,在第二次调用中显式指定的右值引用发生了什么,因为在本例中,两个右值引用合并为一个,因此没有进行任何推导。第一个变量 f(int(1))f(int(1))U==int是相同的==false 第二种变体 f(int(1))U==int&&is_same==true 这
U&
,其中U
是一个可推导的模板参数,用于指示应推导U
,以便保留参数的右值:
- 当传递类型为
的右值时,X
的类型变为U
X
- 当传递类型为
的cv限定左值时,X
成为类型U
X cv&
f(int(1))f(int(1))U==int是相同的==false
第二种变体
f(int(1))U==int&&is_same==true
这就是为什么如果您还定义了一个templatef(U){},那么由于调用不明确,代码无法编译。
template<class U>
void f( U && v)
{
std::cout << typeid(v).name() << "\n"; //'int' in both cases
if( boost::is_same<int&&,U>::value )
{
std::cout << "reach here\n"; //only with f<int&&>(int(1));
}
}
int main()
{
f(int(1));
f<int&&>(int(1));
std::cin.ignore();
}
f(int(1)) <=> f<int>(int(1)) <=> U==int <=> is_same<int&&,int> == false
f<int&&>(int(1)) <=> U==int&& is_same<int&&,int&&> == true