C ++ 11为变量实例化/初始化提供了以下语法;即。
auto myClass = MyClass{};
但是,在复制能力,移动能力和赋值能力方面,类需要什么才能允许这种语法?
Visual Studio 2013(更新2)允许这种形式的实例化,即使复制构造函数,复制赋值运算符,移动构造函数和移动赋值运算符都已被删除,而GCC(4.7.2)仅在移动构造函数默认时才允许这样做或者实现,或者没有定义移动构造函数(即没有删除),并且复制构造函数是默认的或实现的。
根据标准需要什么?
答案 0 :(得分:4)
这与auto
没有任何关系,如果您使用此结果,结果将是相同的
MyClass myClass = MyClass{};
这是复制初始化,它需要一个可访问的复制/移动构造函数。如果实现/显式默认移动构造函数,将创建一个临时MyClass
对象,然后移动。如果没有显式删除移动构造函数,但显式默认/实现了复制构造函数,则隐式删除移动构造函数,并复制临时MyClass
实例。
如果明确删除了移动构造函数,那么初始化将是错误的。类似地,如果您明确删除了复制构造函数,并且没有显式默认/实现移动构造函数,则初始化将是格式错误。
请注意,编译器很可能会删除复制/移动,但初始化仍需要它们。