C++ 当T=int&;时,为什么构造函数消息(常量T&;数据)与消息(T&;数据)冲突;? 模板 结构消息{ T数据; 显式消息(T&&data):数据(std::move(data)){ 标准::cout

C++ 当T=int&;时,为什么构造函数消息(常量T&;数据)与消息(T&;数据)冲突;? 模板 结构消息{ T数据; 显式消息(T&&data):数据(std::move(data)){ 标准::cout,c++,c++11,compiler-errors,move-semantics,overload-resolution,C++,C++11,Compiler Errors,Move Semantics,Overload Resolution,那么,当T=int&时,为什么构造函数消息(const T&data)与消息(T&&data)是重复的呢 因为引用折叠规则 对引用的引用是不存在的。当T是左值引用时——比如说int&,那么T&在语法上似乎是int&。但是这种类型并不存在。语言的规则说,在这种情况下T&折叠为int& 类似地,没有const reference(不要与const混淆,人们在说const reference时有时指的是const)。如果T是左值引用,比如说int&,那么从语法上看T const(与const T相同)

那么,当T=int&时,为什么构造函数消息(const T&data)与消息(T&&data)是重复的呢

因为引用折叠规则

对引用的引用是不存在的。当
T
是左值引用时——比如说
int&
,那么
T&
在语法上似乎是
int&
。但是这种类型并不存在。语言的规则说,在这种情况下
T&
折叠为
int&

类似地,没有const reference(不要与const混淆,人们在说const reference时有时指的是const)。如果
T
是左值引用,比如说
int&
,那么从语法上看
T const
(与
const T
相同)似乎是
int&const
(不要与
int-const&
混淆,后者与
const-int&
相同)。但是这种类型并不存在。语言规则说,在这种情况下,
T-const
折叠为
int&

C++11引入了右值引用,这给我们带来了新的折叠规则。简言之,“右值引用到右值引用”合并为右值引用,但“左值引用到任何引用”,以及“任何引用到左值引用”折叠成左值引用。这条规则是转发引用工作原理背后的魔法的一部分

因此,给定
T=int&
,它们声明相同的函数:

explicit Message(T&& data)      // type of argument is int &
explicit Message(const T& data) // type of argument is int &


另外,对于非引用也有折叠规则:没有const-const类型。因此,给定
const-T
,其中
T
const-int
,然后它折叠成
const-int
。在您的示例中,
T
const-int&
,而不是
t&
@eerorika当
t
int&
时,错误是相同的。因此,这意味着我在语句
make_Message(a)
-->
中实例化一个类
Message
,而不是
Message
中实例化
Message