【问题标题】:Default move constructor Visual Studio 2015默认移动构造函数 Visual Studio 2015
【发布时间】:2016-01-22 07:30:16
【问题描述】:

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

编辑:删除“隐含”措辞

【问题讨论】:

  • 在示例中,您明确要求默认的移动和复制构造函数,即它们不是隐式生成的,因此如果您想测试隐式生成的构造函数,那么您的程序不会这样做。
  • 呃,是的,“隐式”部分不需要,我只想知道是否支持默认移动构造函数,我将编辑问题。
  • 第二个链接好像是说Yes: ""Rvalue references v3.0" 增加了新规则,在一定条件下自动生成移动构造函数和移动赋值运算符。这个在Visual中实现工作室 2015。”

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    C++ 使用“默认”这个词的方式有一点潜在的混淆。

    在最常见的情况下,我们知道要求默认值是为了得到你无论如何都会得到的东西 - 没什么特别的。

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

    即:

    Test(Test&& other) = default;
    

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

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

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

    希望对你有帮助。

    【讨论】:

    • 第一个链接说:“Visual Studio 不支持 C++11 标准要求的默认移动构造函数或移动赋值运算符。”第二个链接说“默认和删除函数。现在支持这些,但有一个例外:对于默认函数,不支持使用 =default 来请求成员移动构造函数和移动赋值运算符。”这是否意味着不支持默认生成?
    • @newprogrammer 我认为您的代码显示生成了默认的移动构造函数。或者你对它编译的事实有另一种可能的解释?另外,正如我在回答中提到的,测试输出不是很有意义。唯一的测试是代码可以编译。
    • @juanchopanza 是的,我用详细类型尝试过,肯定使用了移动构造函数,而不是复制构造函数。
    • @newprogrammer 以与您正在做的事情无关的微妙方式。事实上,我读到它说它将实现标准默认删除的成员。您的代码显式实例化默认值。
    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2012-06-15
    • 2016-12-16
    相关资源
    最近更新 更多