这是我想到的情况:
#include <iostream>
using namespace std;
struct test {
test() { cout << "ctor" << endl; }
test(const test&) = delete;
test(test&&) = delete;
};
auto f() -> test {
return {};
// return test{};
}
auto main() -> int {
f();
}
这段代码可以同时使用clang和gcc进行编译,但是当我将
return {}
更改为return test{}
时,它将不再编译。这是为什么?它在两种情况下都不应该一样工作吗?坦白说,我不知道是否有很好的用例,但是这让我感到惊讶,所以现在我想知道发生了什么。
最佳答案
return {}
使用空的初始化程序列表使用默认构造函数初始化返回值。return test{}
使用默认构造函数创建一个临时实例,然后使用该实例通过移动或复制构造函数初始化返回值。您已经删除了这些构造函数,因此无法完成。
实际上,复制或移动将被删除,以使两者具有相同的效果-但第二个复制或移动仍需要可访问的构造函数,即使实际上并未使用它也是如此。