允许自动关键字实例化的类所需要的条件



c++ 11为变量实例化/初始化提供了以下语法:例如

auto myClass = MyClass{};
然而,在可复制性、可移动性和可赋值性方面,一个类需要具备哪些条件才能允许这种语法呢?

Visual studio 2013(更新2)允许这种形式的实例化,即使复制构造函数,复制赋值运算符,移动构造函数和移动赋值运算符都已被删除,而GCC(4.7.2)只允许在move构造函数默认或实现,或者move构造函数未定义(即未删除)且复制构造函数默认或实现的情况下。

根据标准要求是什么?

这与auto没有任何关系,如果您使用这个代替,结果将是相同的

MyClass myClass = MyClass{};

这是复制初始化,它需要一个可访问的复制/移动构造函数。如果您实现/显式默认移动构造函数,将创建一个临时MyClass对象,然后移动。如果您没有显式删除移动构造函数,而是显式默认/实现复制构造函数,那么移动构造函数将被隐式删除,并且临时MyClass实例将被复制过来。

如果显式删除move构造函数,则初始化将是错误的。类似地,如果显式地删除复制构造函数,而不显式地默认/实现move构造函数,则初始化将是错误的。

注意,复制/移动很可能会被编译器忽略,但它们仍然是初始化所必需的。

最新更新