C++ 当T=int&;时,为什么构造函数消息(常量T&;数据)与消息(T&;数据)冲突;? 模板 结构消息{ T数据; 显式消息(T&&data):数据(std::move(data)){ 标准::cout
那么,当T=int&时,为什么构造函数消息(const T&data)与消息(T&&data)是重复的呢 因为引用折叠规则 对引用的引用是不存在的。当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&
,那么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
。