【问题标题】:User-declared default constructor + in-class initializers != user-provided constructor? [duplicate]用户声明的默认构造函数 + 类内初始化器!= 用户提供的构造函数? [复制]
【发布时间】:2013-07-05 22:20:59
【问题描述】:

Clang documentation 巧妙地解释了这一点

如果类或结构没有用户定义的默认构造函数,C++ 不允许您默认构造它的 const 实例,例如 这([dcl.init],p9)

基本原理是,如果 const 对象未正确初始化,则以后无法更改。以下代码只有Test 的用户声明默认构造函数,但其​​所有成员都有类内初始化器,

#include<iostream>

class Test
{
public:
    Test() = default;
    void print() const { std::cout << i << "\n"; }
private:
    int i = 42;   // will propagate to the default constructor!
};

int main()
{
    Test const t; // <-- Clang chokes on the const keyword, g++ does not
    t.print();    // prints 42
}

因此,用户提供默认构造函数的理由对我来说似乎是多余的。事实上,g++ 4.8.1 确实可以毫无问题地编译它 (Online Example),尽管 Clang 没有。

问题:为什么完整的类内初始化器 + 用户声明的默认构造函数的组合不足以默认构造一个 const 对象? C++14 标准是否正在进行修复?

更新:任何人都可以尝试使用 Clang 3.3 / 3.4 来查看与 Clang 3.2 相比是否已修复此问题?

【问题讨论】:

  • 我认为这是Clang中的一个错误/bug,g++接受代码是正确的。
  • @JerryCoffin 有任何标准的引用吗?我问是因为没有类内初始化程序,标准说 Clang 是正确的。
  • 不是真正的报价,但到 N3337 时,措辞已经更改,因此此要求已消失。鉴于它在标准中,我想称它为错误或错误可能有点不准确,但在这一点上,我认为大多数编译器大多忽略 C++11 本身 i> 并追求更新的草稿。
  • @JerryCoffin 那么标记为“活动”的 DR 是否已经包含在规范中,这与我的回答所说的相反?用什么解决方案?
  • @JohannesSchaub-litb:TBH,我不完全确定——DR 中引用的措辞似乎已经消失,但这可能是其他编辑的副作用,它们是仍在进行更多更改以更具体地处理此 DR(或不 - 不回顾会议记录,我不确定为什么事情会变成现在的样子)。

标签: c++ c++11 default-constructor c++14 in-class-initialization


【解决方案1】:

是的,这是一个已知问题。见http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253。它尚未在规范中修复。

【讨论】:

  • +1 并被接受。很高兴知道它在雷达上。
  • 您是否有机会访问 Clang 3.3 / 3.4 来检查它是否仍然存在问题?
  • @TemplateRex 不幸的是,使用 clang 3.4(主干 184647)仍然是一个问题。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多