模板的内部枚举类不被视为常量表达式? P>我使用C++,我遇到了一点泡菜。如果我有以下(人为的)示例代码 #包括 #包括 结构{ 枚举类枚举{A,B,C}; 静态constexpr std::string\u视图字符串[]{ [static_cast(ENUM::A)]=“A”, [static_cast(ENUM::B)]=“B”, [static_cast(枚举::C)]=“C” }; constepr std::string_视图运算符[](枚举e)const{ 返回字符串[static_cast(e)]; } };

模板的内部枚举类不被视为常量表达式? P>我使用C++,我遇到了一点泡菜。如果我有以下(人为的)示例代码 #包括 #包括 结构{ 枚举类枚举{A,B,C}; 静态constexpr std::string\u视图字符串[]{ [static_cast(ENUM::A)]=“A”, [static_cast(ENUM::B)]=“B”, [static_cast(枚举::C)]=“C” }; constepr std::string_视图运算符[](枚举e)const{ 返回字符串[static_cast(e)]; } };,c++,gcc,constant-expression,C++,Gcc,Constant Expression,一切正常。但是,如果我现在模板化结构,即 #包括 #包括 模板 结构{/*相同的结构定义*/}; 我得到一个编译时错误,即我拥有的C99指示符初始值设定项不是整型常量表达式 事实上,在一些使用名称空间的情况下,我会遇到内部编译器错误/内部编译器segfault,这使我相信这是一个内部问题,但我无法确认这一点 如果我将作用域enum类移到模板之外,一切都会恢复正常。通过这种方式,我可以简单地在实际代码中添加一级间接寻址,但是我不希望这样做 更奇怪的是:假设我将内部数组的类型更改为ints。即

一切正常。但是,如果我现在模板化结构,即

#包括
#包括
模板
结构{/*相同的结构定义*/};
我得到一个编译时错误,即我拥有的C99指示符初始值设定项不是整型常量表达式

事实上,在一些使用名称空间的情况下,我会遇到内部编译器错误/内部编译器segfault,这使我相信这是一个内部问题,但我无法确认这一点

如果我将作用域enum类移到模板之外,一切都会恢复正常。通过这种方式,我可以简单地在实际代码中添加一级间接寻址,但是我不希望这样做

更奇怪的是:假设我将内部数组的类型更改为
int
s。即

struct结构{
枚举类枚举{A,B,C};
静态constexpr int INTS[]{
[static_cast(枚举::A)]=65,
[static_cast(枚举::B)]=66,
[static_cast(枚举::C)]=67
};
constexpr int运算符[](枚举e)const{
返回整数[static_cast(e)];
}
};
我也有同样的问题。但是现在如果我通过枚举的静态强制转换来赋值,就像指定符一样,也就是说

。。。
静态constexpr int INTS[]{
[static_cast(ENUM::A)]=static_cast(ENUM::A),
[static_cast(ENUM::B)]=static_cast(ENUM::B),
[static_cast(ENUM::C)]=static_cast(ENUM::C)
};
...

不管是不是模板,这都行这个扩展不是在GNU C++中实现的。你的问题到底是什么?我的意思是有趣,但是你已经知道它不是标准C++,你知道GCC是什么,什么不是,现在什么?代码>我不能辨别这是一个bug,还是它的行为。是哪一个?我认为最好的提问方式是询问gcc开发人员。转到gcc邮件列表并询问他们。如果您发现“内部错误”或错误,请确保它是可复制的,并且(几乎)肯定是一个bug。