【问题标题】:Why does gcc allow a const object without a user-declared default constructor but not clang?为什么 gcc 允许 const 对象没有用户声明的默认构造函数但不允许 clang?
【发布时间】:2014-11-22 13:00:24
【问题描述】:

最近Why does a const object requires a user-provided default constructor? 被标记为与Why does C++ require a user-provided default constructor to default-construct a const object? 重复。我正在使用 colirurextexter 来测试各种版本的 gcc(g++-4.7、g++-4.8、g++-4.9)和 clang(3.4 和 3.5),看看是否在更新版本中引入了这种行为编译器的版本。这里我们有两个测试用例,分别来自两个问题:

class A {
public:
    void f() {}

};

int main()
{
    A a;       // OK
    const A b; // ERROR

    a.f();
    return 0;
}

和:

struct B{
  B():x(42){}
  int doSomeStuff() const{return x;}
  int x;
};

struct A{
  A(){}//other than "because the standard says so", why is this line required?

  B b;//not required for this example, just to illustrate
      //how this situation isn't totally useless
};

int main(){
  const A a;
}

clang 错误输出:

 error: default initialization of an object of const type 'const A' requires a user-provided default constructor
  A const a;
          ^

预期但不是 gcc,MSVC 也不是。我想我可能会发疯,因为标准引号清楚地表明:

§ 8.5

6 默认初始化 T 类型的对象意味着:

——如果 T 是一个(可能是 cv 限定的)类类型(第 9 条),则默认构造函数 for T 被调用(如果 T 没有 可访问的默认构造函数);

[...]

如果一个程序调用 const 限定类型 T, T 的对象的默认初始化 应该是具有用户提供的默认构造函数的类类型。

11 如果没有为对象指定初始化器,则该对象为 默认初始化; [...]

n3337 中似乎缺少第二个问题中出现的非 POD 语言,所以也许我遗漏了一些可能已经改变的东西。这是错误、重复还是我遗漏了什么?

【问题讨论】:

    标签: c++ gcc clang


    【解决方案1】:

    规范目前需要用户提供的默认构造函数,但似乎 GCC 正在实现基于 DR 253 的更改,这表示如果在没有用户提供的默认构造函数的情况下初始化所有子对象,那么用户提供的默认构造函数不是必需的。

    此更改仅处于草案状态,尚未被接受且不属于标准的一部分。所以我认为这是 GCC 开发人员想要的行为,但我不确定这是否是一个符合标准的扩展。

    这是对第一个示例的更改,它导致 GCC 产生错误:

    class A {
    public:
        void f() {}
    
        int i;
    };
    
    int main()
    {
        A a;       // OK
        const A b; // ERROR
    
        a.f();
        return 0;
    }
    

    请注意,gcc 将错误降级为带有 -fpermissive 标志的警告。

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42844

    【讨论】:

    • 是的,确实是gcc的bug。
    • 那个 bug 指的是DR 253,这表明 GCC 的行为是预期的行为,标准将被更新以完全要求。
    • @hvd 啊,谢谢。我看到提到了 DR 253,但从未追查过它。更新我的答案。
    • @MarcGlisse 嗯,你是对的。我想我看到那面旗帜来自其他地方。
    • 我会说实施一个甚至还没有“准备好”(甚至没有提议的解决方案)的问题是相当狡猾的,更不用说“DR”了。我称之为不合格。
    猜你喜欢
    • 2018-08-15
    • 2016-08-29
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多