Sam*_*ett 10 c++ gcc unions compiler-bug c++11
我可能在GCC v4.8.2中发现了一个错误,但我想在提交之前先检查一下,因为这可能是我做错了!
以下代码:
#include <vector>
struct Message
{
typedef union {
char byte;
const char *str;
} Parameter;
Parameter p1;
Parameter p2;
};
int main()
{
std::vector<Message> messages_;
messages_.push_back({{ .byte = 'a' }});
Message message = {{ .byte = 'a' }, { .str = "Hello World" }};
messages_.push_back(message);
messages_.push_back({{ .byte = 'a' }, { .str = "Hello World" }});
}
Run Code Online (Sandbox Code Playgroud)
clang++ -std=c++11 main.cpp编译这个罚款.但g++输出这个:
main.cpp: In function ‘int main()’:
main.cpp:23:66: internal compiler error: in reshape_init_class, at cp/decl.c:5216
messages_.push_back({{ .byte = 'a' }, { .str = "Hello World" }});
^
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://bugzilla.redhat.com/bugzilla> for instructions.
Preprocessed source stored into /tmp/ccrf5vwr.out file, please attach this to your bugreport.
Run Code Online (Sandbox Code Playgroud)
如果没有人有任何想法,我会将此作为错误提交,尽管根据我的经验,程序员问题几乎从来都不是编译器错误,而且几乎总是他自己的错!
正如上面评论中的回答:您从 GCC 收到的任何包含短语internal compiler error和的错误消息Please submit a full bug report绝对是编译器错误,而不是您自己的错!在这种情况下,该错误似乎与 GCC 在 C++ 模式下的解析有关,{{ ... }}其中“ ...”包含指定的初始值设定项。@Sam 已将其报告为 GCC bug 59832。
然而,正如@Angew指出的,这一行 \xe2\x80\x94
\n\nmessages_.push_back({{ .byte = \'a\' }});\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\x94 不是有效的 C++。标准 C++ 不允许指定初始值设定项;这是 C99 功能,但未被 C++ 采用(C++11 和 C++14 均未采用)。
\n\n至于为什么指定的初始值设定项添加到 C++ 中会出现问题,请参阅此处,其中 Doug Gregor 询问编译器应如何解释诸如
\n\nstruct Foo {int x,y; };\nvoid f(Foo);\nvoid f(std::initializer_list<int>);\n\nint main(){\n f({1});\n f({1,2});\n f({1,2,3});\n f({.x=1});\n f({.x=1,2});\n f({.x=1,2,3});\n}\nRun Code Online (Sandbox Code Playgroud)\n\n根据记录,GCC 4.8 将所有六个视为对f(initializer_list<int>). Clang 3.5 将前三个视为对 的调用f(initializer_list<int>),接下来两个视为对 的调用f(Foo),最后一个视为格式错误。基本上,它是一个非标准的构造:不同的编译器有权以不同的方式对待它,而且他们确实这样做了。
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |