C++11为变量实例化/初始化提供了以下语法:
auto myClass = MyClass{};
然而,在可复制性、移动能力和赋值能力方面,类需要什么才能允许这种语法呢?
Visual studio 2013 (更新2)允许这种形式的实例化,即使复制构造函数、复制赋值操作符、移动构造函数和移动赋值运算符都已被删除,而GCC (4.7.2)只允许在默认或实现移动构造函数或未定义移动构造函数(即未删除)以及副本构造函数被默认或实现时允许实例化。
根据标准有什么要求?
发布于 2014-07-29 07:01:22
这与auto
没有任何关系,如果您使用此方法,结果将是相同的
MyClass myClass = MyClass{};
这是副本初始化,它需要一个可访问的复制/移动构造函数。如果实现/显式默认移动构造函数,则将创建一个临时MyClass
对象,然后移动该对象。如果不显式删除移动构造函数,而是显式默认/实现复制构造函数,则移动构造函数将被隐式删除,临时MyClass
实例将被复制。
如果显式删除移动构造函数,则初始化将不正确。类似地,如果显式删除复制构造函数,而不显式默认/实现移动构造函数,则初始化将不正确。
注意,复制/移动很可能被编译器删除,但是初始化仍然需要它们。
https://stackoverflow.com/questions/25018153
复制相似问题