SceneManager()=默认值;是一个删除的功能

时间:2015-02-16 23:32:37

标签: c++11

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)
}

我已阅读https://msdn.microsoft.com/en-us/library/dn457344.aspx,并想知道为什么我无法编译我的代码,因为我有一个SceneManager _sceneManager成员变量,Visual Studio 2013中的工具提示告诉我“无法引用SceneManager的默认构造函数 - 它是删除的功能“。

上面的代码遗憾的是没有SCCNE,因为我无法找出导致错误的原因,因为我希望= default关键字与简单地提供SceneManager()没什么不同;因为我没有看到没有生成构造函数的原因。

在哪种情况下删除了= default声明的构造函数?

  

显然可以通过删除= default来解决问题。

这显然是错误的。查看所选答案!

1 个答案:

答案 0 :(得分:3)

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

如果出现以下情况,则将类X的默认默认构造函数定义为已删除:

  • X是一个类似联合的类,其变体成员具有非平凡的默认构造函数,
  • 任何没有 brace-or-equal-initializer 的非静态数据成员都是引用类型,
  • 没有 brace-or-equal-initializer 的const-qualified类型(或其数组)的任何非变量非静态数据成员都没有用户提供的默认构造函数,
  • X是一个联合,其所有变体成员都是const限定类型(或其数组),
  • X是一个非联合类,任何匿名联合成员的所有成员都是const限定类型 (或其阵列),
  • 任何可能构造的子对象,除了具有大括号或等于初始化程序的非静态数据成员外,都具有类类型M(或其数组)和{{ 1}}没有默认构造函数或重载解析(13.3),因为应用于M的默认构造函数导致歧义或在默认构造函数中删除或无法访问的函数,或
  • 任何可能构造的子对象都有一个带有析构函数的类型,该类型在默认的默认构造函数中被删除或无法访问。
  

显然可以通过删除= default来解决问题。

我目前没有以任何方式预见符合C ++ 11/14的编译器,除了这样做的可能性,默认构造函数签名变得无法提供,而不是用户声明和编译器提供的已删除。如果用户声明了其他M构造函数,则存在后一种可能性。