我正在查看这个答案,涉及自动生成移动操作的规则?,希望现在已经有了很好的答案。
显示哪些构造函数/赋值运算符“未声明”,“默认”或“删除”,取决于类中声明了什么的幻灯片显示:
显示哪些构造函数/赋值运算符“未声明”,“默认”或“删除”,取决于类中声明了什么的幻灯片显示:
我将从这些幻灯片中获取这个内容,红色方框表示此行为已经过时。
当编译以下内容时:
#include <iostream>
struct X
{
template<typename...T>
X(T&&...) {
std::cout << "Yay!\n";
}
~X() {}
};
int main() {
X x0;
X x1{x0};
X x2{std::move(x0)};
}
看起来它们已经“未声明”,因为它可以编译并输出“Yay!”三次(至少对我来说是好的)。但我想确认我是否可以依赖这种行为。
编辑
Frank 指出,如果还添加了一个拷贝构造函数,它仍然会输出“Yay!”三次,这是有趣的行为。进一步测试,如果添加移动构造函数,则只会输出“Yay!”两次。有人能解释这种行为吗?