【问题标题】:According to §12.1/4 in the C++11 Standard, the code shouldn't compile根据 C++11 标准中的 §12.1/4,代码不应编译
【发布时间】:2014-02-01 08:08:40
【问题描述】:

§12.1/4:及其第一个要点

类 X 的默认构造函数是类 X 的构造函数 可以不带参数调用。如果 类 X 没有用户声明的构造函数,没有参数的构造函数被隐式声明为默认 (8.4)。一个 隐式声明的默认构造函数是 它的类。类 X 的默认默认构造函数定义为 在以下情况下删除:

  • X 是一个类似联合的类,它有一个变体成员和一个重要的默认构造函数,

根据这个要点,这个 sn-p 不应该编译,因为 struct A 是一个类似联合的类(它包含一个匿名联合),它有一个变体成员 B b; 和一个非平凡的默认构造函数.但是code compiles without a problem in vc++, clang++ and g++

#include <iostream>

struct B { B(): i(10) {} int i; };

struct A
{
    union{ int y = 1; double x; };
    int i;
    A(int j) : i{j} {};
    B b;
    A() = default;
};

int main() {
    A a;
}

【问题讨论】:

  • 您确定bvariant 成员吗?我现在无法检查,但这听起来很可疑,好像只有 yx 是变体成员。
  • 该标准从不要求代码不编译 - 但有时确实需要诊断(错误/警告)。

标签: c++ c++11 constructor language-lawyer


【解决方案1】:

变体成员是

union{ int y = 1; double x; };

它们都没有一个重要的构造函数。

这在 §9.5/8 中定义:

9.5 联合 [class.union]

8类联合类 是一个联合或具有匿名联合作为直接成员的类。类似联合的类 X 有一组变体成员。如果X 是联合,则其变体成员是非静态数据成员;否则,它的变体成员是所有匿名联合的非静态数据成员,它们是X 的成员。

【讨论】:

  • 你是对的。抱歉让我分心了。一旦我被允许,我会尽快接受你的回答。谢了。
  • @user1042389:不要担心误读标准,有时我想知道它是否被设计混淆了(尽管更有可能,这只是其庞大性质的结果)。
  • @MatthieuM。您不是唯一一个对此感到疑惑的人,例如,请参阅我问过的 this question 以及安迪回答下方的 cmets。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多