【发布时间】:2014-04-11 06:38:58
【问题描述】:
相关:How to initialize a non-POD member in Union
标准说
联合的最多一个非静态数据成员可以有一个大括号或等号初始化器。
但是
struct Point {
Point() {}
Point(int x, int y): x_(x), y_(y) {}
int x_, y_;
};
union U {
int z;
double w;
Point p = Point(1,2);
};
#include <iostream>
int main () {
U u;
std::cout << u.p.x_ << ":" << u.p.y_ << std::endl;
}
打印4196960:0,而不是预期的1:2。
我认为这是一个编译器错误。是这样吗?
【问题讨论】:
-
我不希望它编译,因为联合的默认构造函数应该被隐式删除,因为
Point没有一个微不足道的默认构造函数。当然,除非该成员初始化算作用户提供的默认构造函数。 -
g++ 打印 134514827:-1218232320
-
我忘了说。我的 g++ 安装可重现(这是一个词吗?)打印出来。
-
经过一番搜索,这似乎是一个 GCC 错误。
-
我猜想 clang 正在成功编译它,因为它临时实现了 Core Working Group issue 1623 的解决方案作为扩展:“因为非静态数据成员初始化程序的存在在道德上等同于 mem-初始化器,这些规则可能应该被修改,以便在联合成员具有非静态数据成员初始化器时将生成的构造函数定义为已删除。”虽然C++ Defect Report Support in Clang 对此只字未提。
标签: c++ c++11 g++ compiler-bug