这是我想到的情况:

#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{}使用默认构造函数创建一个临时实例,然后使用该实例通过移动或复制构造函数初始化返回值。您已经删除了这些构造函数,因此无法完成。

实际上,复制或移动将被删除,以使两者具有相同的效果-但第二个复制或移动仍需要可访问的构造函数,即使实际上并未使用它也是如此。

07-24 09:45
查看更多