【问题标题】:C++ why does this construction even works? [duplicate]C ++为什么这种结构甚至有效? [复制]
【发布时间】:2021-01-15 16:35:08
【问题描述】:

我想知道为什么这段代码可以正确编译。由于删除了复制构造函数和赋值运算符,我认为这些机制将不可用。

我认为main() 中的构造被编译器替换为某种emplace 构造,该构造由Object 本身有效地制作......但我不知道为什么或如何会发生这种情况。

struct Object
{
private:
    friend struct ObjectFactory;
    Object() {}
    Object(const Object& other) = delete;
    Object& operator=(const Object&) const = delete;
};

struct ObjectFactory
{
    static Object CreateObject() { return Object(); }
};

int main()
{
    Object object1 = ObjectFactory::CreateObject();
    Object object2 ( ObjectFactory::CreateObject() );
    Object object3 { ObjectFactory::CreateObject() };
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    我想知道为什么这段代码可以正确编译。由于复制构造函数和赋值运算符被删除,我认为这些机制将不可用。

    您的代码无法使用 C++11 或 C++14 进行编译。然而,由于 C++17——感谢guaranteed copy elision——一个函数可以返回一个 prvalue,即使类型不是可复制的可移动的.


    请注意,这只适用于返回纯右值。例如,如果您定义 CreateObject() 以使 return 语句中的表达式不是纯右值而是 左值

    static Object CreateObject() {
       Object object;
       return object; // <-- lvalue, not a prvalue
    }
    

    这个函数甚至不能用 C++17 编译:

    error: call to deleted constructor of 'Object'

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 1970-01-01
      • 2023-03-21
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多