【发布时间】:2016-12-16 08:09:00
【问题描述】:
查看this question,它只提到C++11 及更高版本:
如果没有用户声明的复制构造函数、复制赋值运算符或析构函数,并且生成的移动构造函数是有效的(例如,如果它不需要分配常量成员),则移动构造函数是自动生成的(§12.8 /10)。
所以如果我有以下代码:
class Y
{
public:
Y(const Y&) {}
};
struct hasY {
hasY() = default;
hasY(hasY&&) = default;
Y mem;
};
hasY hy, hy2 = std::move(hy); //this line fails as expected as Y has a user-defined copy constructor.
现在如果我将默认构造函数添加到 Y:
Y() {}
错误消失了。
它在哪里说默认构造函数导致创建移动构造函数?
(使用 VS 2015 更新 2)
【问题讨论】:
-
默认构造函数不会导致创建移动构造函数。代码中的错误是由于
hasY hy无法完成,因为mem没有可访问的构造函数。您可以通过提供这样的构造函数来解决此问题。编译器错误消息应表明这一点。如果您发布确切的编译器输出可能会有所帮助。 -
@M.M 如果我有:hasY hy;并且 Y 没有默认构造函数,错误是:hasY::hasY(void)':尝试根据您所说的引用已删除的函数。但这仍然不能解释为什么它使用 hy2 = std::move(hy); 成功构建;现在。
-
是的,“删除的函数”是hasY的构造函数,因为
mem没有可访问的构造函数而被删除
标签: c++ c++11 constructor