允许自动关键字实例化的类需要什么?

时间:2014-07-29 14:42:06

标签: c++ c++11 auto

C ++ 11为变量实例化/初始化提供了以下语法;即。

auto myClass = MyClass{};

但是,在复制能力,移动能力和赋值能力方面,类需要什么才能允许这种语法?

Visual Studio 2013(更新2)允许这种形式的实例化,即使复制构造函数,复制赋值运算符,移动构造函数和移动赋值运算符都已被删除,而GCC(4.7.2)仅在移动构造函数默认时才允许这样做或者实现,或者没有定义移动构造函数(即没有删除),并且复制构造函数是默认的或实现的。

根据标准需要什么?

1 个答案:

答案 0 :(得分:4)

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

MyClass myClass = MyClass{};

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

如果明确删除了移动构造函数,那么初始化将是错误的。类似地,如果您明确删除了复制构造函数,并且没有显式默认/实现移动构造函数,则初始化将是格式错误。

请注意,编译器很可能会删除复制/移动,但初始化仍需要它们。