【发布时间】:2019-12-25 03:29:37
【问题描述】:
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) 时出现以下编译时错误。
错误:'Message' 的多个重载实例化为相同的签名 'void (const int &&)'
显式消息(常量 T& 数据):数据(数据){
之前的声明在这里
显式消息(T&& 数据) : data(std::move(data)) {
但是,当我调用 make_message(1024) 和 make_message(std::move(a)) 时,它可以工作。
那么为什么当 T = int& 时构造函数 Message(const T& data) 与 Message(T&& data) 重复?
【问题讨论】:
-
在您的示例中,
T是const int&,而不是int&。 -
@eerorika 当
T是int&时,错误是一样的。
标签: c++ c++11 compiler-errors move-semantics overload-resolution