【问题标题】:Inheriting-Constructors + In-Class-Initialization of non-default constructabe type fails非默认构造函数类型的继承构造函数 + 类内初始化失败
【发布时间】:2014-10-23 19:51:18
【问题描述】:

我在我的项目中遇到以下错误:

错误:使用已删除的函数‘C::C(int)’ 注意:‘C::C(int)’是 隐式删除,因为默认定义格式不正确: 错误:使用已删除的函数“M::M()”

这是我正在使用的代码:

struct M {
    M(int){}
    M() = delete;  // Allowing this would work.
};

struct B {
    B(int) {}
    B() = delete;
};

struct C : public B {
    using B::B;
    M n = {5};

    // C(int i) : B(i) {}  // Adding this would work
};

C c{1};

有人知道为什么会这样吗?


显然,该语言愿意在继承的构造函数的末尾附加更多初始化(因为它愿意调用默认构造函数)。显然,它愿意在显式定义的构造函数的末尾隐式添加对非默认构造函数(类内初始化)的调用。但是由于某种我不明白的原因,它不愿意同时做这两个。

根据this question,完美转发还不够完美,不应该在这里使用。

注意:在实际情况下,B 的构造函数要复杂得多,并且可能会发生变化,因此手动转发内容并不是一个真正可行的选择。

【问题讨论】:

  • 问题在删除B() 吗?编译器无法写入默认的C(),因为它需要默认的B() 存在...
  • 程序用clang++3.5编译
  • 据我了解的标准,这个程序实际上是格式良好的。隐式定义的 C(int) ctor 应定义为 C(int p) : B(static_cast<int&&>(p)) {}
  • g++4.8 似乎忽略了“继承” ctor (C(int)) 中的 NSDMI,它不应该这样做。谁能在最近的 g++ 上确认这一点?
  • gcc5.0 主干和gcc4.9 上也失败。也找不到任何现有的错误报告。你应该报告它 - gcc.gnu.org/bugzilla

标签: c++ c++11 in-class-initialization inheriting-constructors


【解决方案1】:
猜你喜欢
  • 1970-01-01
  • 2011-05-20
  • 2018-01-30
  • 2011-01-25
  • 2016-03-24
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多