C++ 类需要什么才能允许自动关键字实例化?

C++ 类需要什么才能允许自动关键字实例化?,c++,c++11,auto,C++,C++11,Auto,C++11为变量实例化/初始化提供以下语法:;i、 e auto myClass = MyClass{}; 然而,在复制能力、移动能力和分配能力方面,类需要什么才能允许这种语法 Visual studio 2013(更新2)允许这种形式的实例化,即使复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符都已删除,而GCC(4.7.2)仅在默认或实现了移动构造函数,或未定义移动构造函数(即未删除)时才允许这种实例化并且复制构造函数是默认的或实现的 标准要求什么?这与auto没有任何关系,如果

C++11为变量实例化/初始化提供以下语法:;i、 e

auto myClass = MyClass{};
然而,在复制能力、移动能力和分配能力方面,类需要什么才能允许这种语法

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


标准要求什么?

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

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

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


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

这与
自动
没有任何关系,如果改用它,结果将是相同的

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

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


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

复制或移动ctor是合法分配所必需的,默认ctor用于构造,dtor用于允许自动存储类对象,匿名与否。由于复制省略,实际使用的仅为默认ctor和dtor。复制或移动ctor是分配合法所必需的,默认ctor用于构造,dtor用于允许自动存储类对象,匿名与否。由于复制省略,实际使用的只是默认的ctor和dtor。“请注意,复制/移动很可能会被编译器省略,但它们仍然是初始化所必需的。”除非编译器是MSVC,当复制/移动被省略时,MSVC不会注意到缺少可访问的复制/移动构造函数,这使得我们不得不每隔几周回答一次这个问题。“请注意,复制/移动很可能会被编译器省略,但它们仍然是初始化所必需的。”除非编译器是MSVC,当复制/移动被省略时,MSVC不会注意到缺少可访问的复制/移动构造函数,使我们不得不每隔几周回答一次这个问题。