Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 右值引用模板推导 模板 无效f(U&v) { std::cout_C++_Templates_Rvalue Reference - Fatal编程技术网

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
  • 当传递类型为
    X
    的cv限定左值时,
    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