默认移动构造函数Visual Studio 2015

时间:2016-01-22 07:30:17

标签: c++ visual-studio visual-studio-2015

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

This linkthis link似乎说不,而this link说是。

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

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。我是犯了一些错误还是实际生成了默认的移动构造函数?

编辑:删除&#34;隐含&#34;措词

2 个答案:

答案 0 :(得分:4)

正在生成移动构造函数。只是通过复制来实现移动if (no != null && noparent != null && no.name == noparent.name) { //do something } (将&#34;移动的&#34;对象设置为其他值会比将其保留原样更昂贵。)

您可以使用详细的可移动类型作为数据成员而不是int来测试这一点。

答案 1 :(得分:2)

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

Visual Studio 2015支持defaultdeleted功能。 我认为在第二个链接中已经明确说明了这一点。

C ++使用“默认”一词的方式存在一些潜在的混淆。

在大多数情况下,我们都明白要求默认是获得你原本应该得到的东西 - 没什么特别的。

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

那是:

Test(Test&& other) = default;

并不意味着“根据类的其他功能提供或不提供移动构造函数的默认操作”。

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

请阅读=说'将此分配给默认实现'而不是'在此处执行默认操作。

我希望有所帮助。