c – 当返回不可移动的不可复制对象时,ctor {}和{}之间的差异

前端之家收集整理的这篇文章主要介绍了c – 当返回不可移动的不可复制对象时,ctor {}和{}之间的差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我想出的情况:
#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 {}以返回test {}时,它不再编译.这是为什么?在这两种情况下,它不应该是一样的吗?
坦白说,我不知道这是否有一个很好的用例,但它让我感到惊讶,所以现在我想知道发生了什么.

解决方法

return {}使用空的初始化列表来初始化返回值,使用默认构造函数.

return test {}使用默认构造函数创建一个临时文件,然后使用它使用移动或复制构造函数来初始化返回值.你已经删除了这些构造函数,所以不能完成.

在实践中,复制或移动将被消除,以便两者具有相同的效果 – 但是第二个仍然需要可访问的构造函数,即使它没有被实际使用.

猜你在找的C&C++相关文章