C++为什么这个构造函数会奏效?

3
我想知道为什么这段代码可以正确编译。由于复制构造函数和赋值运算符被删除,我认为这些机制不应该存在。
我在想,main() 中的构造被编译器替换为某种由 Object 自身有效地创建的 emplace 构造……但我无法弄清楚为什么或者如何发生这种情况。
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() };
}
1个回答

1
我想知道为什么这段代码能够正确编译。既然复制构造函数和赋值运算符被删除,我认为这些机制将不可用。
您的代码在C++11或C++14中无法编译。但是,由于C++17中的保证复制省略,即使类型不可复制或不可移动,函数也可以返回prvalue
请注意,这仅适用于返回prvalues的情况。例如,如果您定义了CreateObject(),以便在return语句中的表达式不是prvalue而是lvalue
static Object CreateObject() {
   Object object;
   return object; // <-- lvalue, not a prvalue
}

这个函数甚至在C++17中都无法编译:

error: call to deleted constructor of 'Object'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接