C++11 SceneManager()=默认值;是一个已删除的函数 类场景管理器{ 公众: SceneManager()=默认值; ~SceneManager()=默认值; } 类引擎{ Engine():_记录器(“引擎”){}

C++11 SceneManager()=默认值;是一个已删除的函数 类场景管理器{ 公众: SceneManager()=默认值; ~SceneManager()=默认值; } 类引擎{ Engine():_记录器(“引擎”){},c++11,C++11,来自12.1构造函数[class.ctor]/p4: 类X的默认构造函数在以下情况下定义为已删除: X是一个类似于union的类,它有一个带有非平凡默认构造函数的变量成员 没有大括号或相等初始值设定项的任何非静态数据成员都是引用类型 没有大括号或相等初始值设定项的const限定类型(或其数组)的任何非变量非静态数据成员没有用户提供的默认构造函数 X是一个并集,其所有变体成员都是常量限定类型(或其数组) X是非联合类,任何匿名联合成员的所有成员都是const限定类型 (或其阵列) 任何可能构造的

来自12.1构造函数[class.ctor]/p4:

X
的默认构造函数在以下情况下定义为已删除:

  • X
    是一个类似于union的类,它有一个带有非平凡默认构造函数的变量成员
  • 没有大括号或相等初始值设定项的任何非静态数据成员都是引用类型
  • 没有大括号或相等初始值设定项的const限定类型(或其数组)的任何非变量非静态数据成员没有用户提供的默认构造函数
  • X
    是一个并集,其所有变体成员都是常量限定类型(或其数组)
  • X
    是非联合类,任何匿名联合成员的所有成员都是const限定类型 (或其阵列)
  • 任何可能构造的子对象(带大括号或等效初始值设定项的非静态数据成员除外)都具有类类型
    M
    (或其数组),并且
    M
    没有默认构造函数或重载解析(13.3)应用于M的默认构造函数会导致歧义或从默认构造函数中删除或无法访问的函数,或
  • 任何可能构造的子对象都有一个类型,其析构函数已从默认构造函数中删除或无法访问
显然,可以通过删除=default来解决此问题


我目前没有预见到C++11/14兼容编译器会出现任何情况,除了这样做的可能性,默认构造函数签名会变得不可提供,而不是用户声明和编译器提供为删除。如果其他
SceneManager
构造函数是用户声明的,则会出现后一种可能性。

谢谢非常多,我花了很长时间才理解原因,但我认为是6)。由于Logger mutable\u Logger不包含默认构造,很明显它无法编译,因为它应该如何知道\u Logger的构造函数的参数!这是一个非常有用和美妙的答案!
class SceneManager{
public:
SceneManager() = default;
~SceneManager() = default;
}
class Engine{
Engine() : _logger("Engine"){} << ERROR
private:
SceneManager s;
Logger mutable logger; // has only a constructor Logger(const std::string& name)
}