为什么编译器在 C++ 中以不同的方式处理带括号的类型,后跟初始化列表?

问题描述 投票:0回答:1

为什么下面相同的代码可以用 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++ 中仍然得到相同的结果吗?

c++ visual-studio clang++
1个回答
0
投票

语法

(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];

	
© www.soinside.com 2019 - 2024. All rights reserved.