在使用auto时初始化struct会导致VS 2013中的副本

时间:2013-08-27 13:50:02

标签: c++ visual-studio c++11 visual-studio-2013

在以下代码中,创建nested对象的行仅打印“构造函数”with gcc,但不打印VS 2013:

#include <iostream>
using namespace std;

struct test {
    test()            { cout << "constructor" << endl; }
    test(const test&) { cout << "copy constructor" << endl; }
    test(test&&)      { cout << "move constructor" << endl; }
    ~test()           { cout << "destructor" << endl; }
};

struct nested {
    test t;
//    nested() {}
};

auto main() -> int {
    // prints "constructor", "copy constructor" and "destructor"
    auto n = nested{};
    cout << endl;

    return 0;
}

输出:

constructor
copy constructor
destructor

destructor

所以我猜这里发生的事情是临时对象被复制到n。没有编译器生成的移动构造函数,所以这就是为什么它不是一个移动。

我想知道这是一个错误还是可接受的行为?为什么添加默认构造函数会阻止复制?

2 个答案:

答案 0 :(得分:7)

问题不在于auto;以下将展示相同的内容:

nested n = nested{};

临时使用{}进行直接初始化,然后使用n进行复制初始化,因为test是类类型(在这种情况下,有用户) -defined constructor)。

实现允许直接初始化最终目标(n),但不是义务,因此要么是合法的。

标准的8.5和8.5.1中有很多(实际上,批次)细节。

答案 1 :(得分:2)

这是MSVC无法进行复制省略(我猜这与brace-init-constructor有关)。这两种方式都是完全合法的。