0

在以下代码中,创建对象的行仅使用 gccnested打印“构造函数” ,而不是 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. 没有编译器生成的移动构造函数,所以这就是它不是移动的原因。

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

4

2 回答 2

7

这不是auto问题所在。以下将展示相同的内容:

nested n = nested{};

临时用 直接初始化{},然后n用 复制初始化,因为test它是类类型(在这种情况下,具有用户定义的构造函数)。

允许实现直接初始化最终目标 ( n),但没有义务这样做,因此两者都是合法的。

标准 8.5 和 8.5.1 中有很多(真的,很多)细节。

于 2013-08-27T14:10:18.940 回答
2

这是 MSVC 执行复制省略的失败(我猜与大括号初始化构造函数有关)。这两种方式都是完全合法的。

于 2013-08-27T14:07:17.727 回答