【问题标题】:Default Move Constructor in Visual Studio 2013 (Update 3)Visual Studio 2013 中的默认移动构造函数(更新 3)
【发布时间】:2014-12-22 06:14:04
【问题描述】:

过去我已经能够找到多个关于此的对话(例如here),但这些对话是很久以前的。我有疑问的代码是:

#include <utility>
#include <iostream>

struct Foo
{
    Foo() = default;
    Foo(const Foo &o)
    {
        std::cout << "copy" << std::endl;
    }
    Foo(Foo &&o)
    {
        std::cout << "move" << std::endl;
    }
};

struct Bar
{
    Foo foo;
};

int main(void)
{
    Bar a;
    Bar b(a);
    Bar c(std::move(a));
}

如果您在 Visual Studio 2013(更新 3)中执行代码,它会为这两种情况打印出“副本”。如果自上面链接中的答案以来标准没有改变,那么输出应该是“复制”,然后是“移动”。 Ideone 似乎给出了正确的输出。这只是 Visual Studio 尚未实现的东西,还是我的代码中缺少某些东西? I know that you cannot mark move constructors as default,但这并不意味着编译器不支持全部生成默认移动构造函数。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    我知道你不能将移动构造函数标记为默认,但这并不意味着编译器不支持一起生成默认移动构造函数

    不幸的是,这正是它的意思。 VS2013 不支持隐式生成移动构造函数和移动赋值运算符。如果是这样,他们就没有理由禁止 = default 语法,尤其是因为您可以为复制构造函数和赋值运算符这样做。

    引用 MSDN:Support For C++11 Features (Modern C++)

    《Rvalue references v3.0》新增规则,在特定条件下自动生成移动构造函数和移动赋值运算符。但是,由于时间和资源的限制,这在 Visual Studio 2013 的 Visual C++ 中并未实现。

    【讨论】:

    • 这令人失望。我还找到了this chart,所以看起来 vNext 应该已经实现了。看来我现在有一些代码要修改...
    • 这很烂很烂。
    • @tomi.lee.jones 这不是真的,看看this table。有问题的功能被标记为默认和删除功能。问题中显示的示例为 VS2015 Preview 的最后一行输出 move
    • @Praetorian 我看过这张表,你是对的,错误是我的部分(VS2015 RC)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多