为什么构造函数 Message(const T&data) 与 Message(T&& data) 冲突,当 T = int&时?
Why constructor Message(const T& data) is conflict with Message(T&& data) when T = int&?
template <typename T>
struct Message {
T data;
explicit Message(T&& data) : data(std::move(data)) {
std::cout << "Move data" << std::endl;
}
explicit Message(const T& data) : data(data) {
std::cout << "Copy data" << std::endl;
}
};
template <typename T>
inline Message<T>*
makeMessage(T&& data) {
return new Message<T>{std::forward<T>(data)};
}
int main() {
const int a = 1024;
auto *copy_msg = makeMessage(a);
}
有一个模板类Message
有两个构造函数:Message(T&& data)
和Message(const T& data)
,调用makeMessage(a)
时出现以下编译时错误。
错误:"消息"的多个重载实例化为同一签名"void (const int &&(">
显式消息(const T& data( : data(data( {
以前的声明在这里
显式消息(T&& data( : data(std::move(data(( {
但是,当我打电话给make_message(1024)
和make_message(std::move(a))
时,它可以工作。
那么为什么构造函数Message(const T& data)
在 T = int&时与Message(T&& data)
重复呢?
那么,当 T = int&时,为什么构造函数 Message(const T& data( 与 Message(T&& data( 重复呢?
因为引用折叠规则。
没有参考这样的东西。当T
是一个左值引用时 - 假设int &
,那么语法上T &
似乎是一个int & &
。但是这种类型不存在。语言规则说,在这种情况下,T &
崩溃成int &
.
同样,没有常量引用这样的东西(不要与引用 const 混淆,人们有时在说 const 引用时指的是 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 T
T
在哪里const int
,那么它就会崩溃成const int
。volatile
也是如此。
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++ 初始化 .data 部分中的变量
- 模式"allocate memory or use existing data"
- boost::asio data owning `ConstBufferSequence`
- Python to C++ Data structure API
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- protobuf C++ SQLite handle blob data
- 错误:字段'dateOfBirth'的类型不完整'Poco::Data::Date'
- 为什么构造函数 Message(const T&data) 与 Message(T&& data) 冲突,当 T = int&时?
- "thread-safe data"与"thread-safe code/functions"的区别
- 如何找到目标文件 *.o 的 ram rom 使用情况(.bss .text .rodata .data)?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- *(int*)&data[18]在这段代码中实际上做了什么?
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 构造中错误:未在此范围中声明"data"
- 我可以在初始化之前使用 std::array 成员变量中的 data() 指针吗?发出警告
- 如何将data[i].int转换为vaible