4

我认为指定的初始化程序在 C++ 中已停止使用,并且仅在 C 中有效。但是,我遇到了一个简单的示例,该示例使用 clang++ 编译并正常工作。

int main()
{
    int a[6] = { [4] = 29, [2] = 15 };
}

g++:https ://rextester.com/AXIZ79197 (错误)

铿锵++:https ://rextester.com/UYVHHP56966 (作品)

vc++:https ://rextester.com/UCBEU10658 (错误)

g++ 和 vc++ 都无法编译,而 clang++ 工作得很好。还值得一提的是,g++ 和 vc++ 给出了不同的错误信息。vc++ 将指定的初始化程序与 lambda 表达式混淆了。我想我可以将此归咎于 g++ 是一个较旧的编译器这一事实,但我不确定。

问题:

  1. 为什么当 g++ 和 vc++ 不允许时,clang 决定允许指定的初始化程序?
  2. 这只是一个编译器错误还是有其他原因?
4

1 回答 1

9

编译时-pedantic会生成以下警告:

source_file.cpp:3:18: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };
                 ^~~~~~~~
source_file.cpp:3:28: warning: designated initializers are a C99 feature [-Wc99-extensions]
    int a[6] = { [4] = 29, [2] = 15 };

很明显,clang++默认情况下启用c99-extensions.

这不是错误,因为编译器可能会选择提供附加功能。clang++开发人员只是决定保持启用它。-pedantic如果我们不想要这些功能,最好使用。

有趣的是,在搜索相关信息时,我在 Clang 页面中找到了 C++ 支持,其中“指定的初始值设定项”被列为通过扩展为即将到来的提案提供部分支持:

对 C++17 之后的 C++ 标准的一些提议特性的实验性支持,临时命名为 C++2a

是即将推出的标准的确切建议。所以在未来的 C++ 中可能会有指定的初始化器。

于 2019-01-31T11:49:28.557 回答