Visual Studio 2013(更新3)中的默认移动构造函数

13

我之前能够找到多个关于这个问题的讨论(例如这里),但是这些讨论都是相当久远的了。我想问的代码是:

#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)中执行代码,它会对两种情况都输出“copy”。如果标准自上面链接中的答案以来没有改变,那么输出应该是“copy”后跟“move”。 Ideone似乎给出了正确的输出。这只是Visual Studio尚未实现的东西,还是我的代码有什么问题? 我知道您无法将移动构造函数标记为默认,但这并不意味着编译器不能完全支持生成默认移动构造函数。
1个回答

20
我知道你无法将移动构造函数标记为默认值,但这并不意味着编译器根本不支持生成默认的移动构造函数。
不幸的是,情况恰恰相反。VS2013不支持隐式生成移动构造函数和移动赋值运算符。如果它支持的话,他们就没有理由禁止`=default`语法,特别是因为对于复制构造函数和赋值运算符,您是允许这样做的。
引用MSDN:支持C++11特性(现代C ++) “Rvalue references v3.0”在某些条件下添加了新规则,以自动生成移动构造函数和移动赋值运算符。然而,由于时间和资源限制,这在Visual Studio 2013的Visual C ++中未实现。

1
真是令人失望。我也找到了这个图表,看起来vNext应该已经实现了它。看来我现在需要去修改一些代码了... - Duncan
17
这很糟糕。 - Samuel Danielson
1
@tomi.lee.jones 这不是真的,请看这个表格。所讨论的特性被标记为Defaulted and deleted functions。问题中展示的例子在VS2015 Preview上输出move - Praetorian
@Praetorian 我看到了这个表格,你是对的,错误是我自己犯的(VS2015 RC)。 - tomi.lee.jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接