This question already has answers here:
Syntax for universal references
                                
                                    (2个答案)
                                
                        
                                5年前关闭。
            
                    
#include <iostream>
#include <typeinfo>

struct C
{
  template<class T>
  C(T && t) { std::cout << typeid(T).name() << std::endl; }
};

struct D
{
  D(int && t) { }
};

int main()
{
    int i = 1;
    std::cout << typeid(i).name() << std::endl;

    C c(i);     // OK
    D d(i);     // error
}


D d(i);行无法编译为:

foo.cc:22:7: error: cannot bind 'int' lvalue to 'int&&'


但是,将其注释掉,生成的输出为:

i
i


这表明T被推导为intD(int &&)如何绑定失败而C(int &&)成功?

最佳答案

根据评论中提供的所有重要信息,回答我自己的问题:


int &&只能绑定到右值
T&&可以绑定到右值和左值


该标准没有“可以绑定到右值和左值”的特定术语,因此Scott Meyers创造了术语“通用引用”,并且this article by him解释了所有内容。

基本原理:非通用版本用于移动语义,但是perfect forwarding需要通用版本。

在C ++ 11的开发过程中,有人认为移动和转发应使用不同的语法,但是它们丢失了,并且&&都被使用了,在推断的上下文中,T&&表示转发,而&&在其他情况下,意味着移动。

乔纳森·韦克利(Jonathan Wakely)的Info taken from this post;实际上,我的问题可以作为该问题的副本来解决。

另外,T const &&也不是通用参考,可能是因为它对转发没有用。

关于c++ - int &&和template <class T> T &&之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24925603/

10-11 22:59
查看更多