为什么下面相同的代码可以用 CLang 编译良好,但不能用 MSVC 编译?
#include <iostream>
const char * NumberToText(int val)
{
return (const char *[]) {
"Zero",
"One",
"Two",
}[val];
}
int main()
{
std::cout << NumberToText(2);
}
这是演示。
MSVC 给出错误:
(5): 错误 C4576: 带括号的类型后跟初始化列表是非标准显式类型转换语法
同时 CLang 编译并执行它就很好。
在 VS2015 enterprise 中的 Error C4576 中我看到一些想法,这是因为这是 C 语言特性,而这在 C++ 中是格式错误的,但是为什么 CLang 会编译这个呢?
我可以保持数组匿名并在 MSVC C++ 中仍然得到相同的结果吗?
语法
(T){E1, E2, ...}
(其中 T
是类型,E*
是表达式)不是有效的标准 C++ 语法。但它是有效的 C,它是所谓的“复合文字”。一些编译器也允许在 C++ 代码中使用复合文字,但这些复合文字在 C++ 上下文中的行为方式并不明显。
特别是,在 GCC(也可能是 Clang)中,复合文字在 C++ 代码中与在 C 代码中具有不同的语义。请参阅 https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html。 所以我建议不要使用它们,即使您只为支持它们的编译器进行编译。
您的示例可以轻松地用符合标准的 C++ 重写:
return std::array{
"Zero",
"One",
"Two",
}[val];