默认移动构造函数 Visual Studio 2015

Default move constructor Visual Studio 2015

本文关键字:Studio 2015 Visual 构造函数 移动 默认      更新时间:2023-10-16

关于Visual Studio 2015是否支持生成默认移动构造函数,似乎存在相互矛盾的文档。

这个链接和这个链接

似乎说不,而这个链接说是。

我尝试了一些简单的事情:

class Test {
public:
    Test(int data) : data(data) {}
    Test(Test&& other) = default;
    Test(Test& other) = delete;
    int data;
};
int main() {
    Test c(3);
    std::cout << c.data << std::endl;
    Test b(std::move(c));
    std::cout << b.data << std::endl;
}

它按预期打印出 3 和 3。我是否犯了错误,或者实际生成了默认移动构造函数?

编辑:删除了"隐含"措辞

正在生成移动构造函数。碰巧移动int是通过复制来实现的(将"移动"对象设置为其他值比保持原样更昂贵。

您可以通过使用详细可移动类型而不是 int 来测试这一点。

你说的两个链接告诉你"不"就是告诉你"是"。

Visual Studio 2015 支持 defaultdeleted 函数。我认为在第二个环节中已经非常清楚地说明了这一点。

C++使用"默认"一词的方式存在一点潜在的混淆。

在大多数情况下,我们理解要求默认值是为了得到你本来会得到的东西 - 没什么特别的。

但在这种情况下,它实际上意味着"重新引入默认实现"。

那是:

Test(Test&& other) = default;

并不意味着"对移动构造函数执行默认操作,该构造函数根据类的其他功能提供或不提供它"。

这意味着"提供移动构造函数的默认实现,即使它不会(默认情况下)基于类的其他功能提供"。

=解读为"将其分配给其默认实现"而不是"在此处执行默认操作"。

我希望这有所帮助。