【发布时间】:2014-02-04 14:21:30
【问题描述】:
以下示例在构造函数中使用字符串字面量初始化 std::array <char, N> 成员不会在 GCC 4.8 上编译,而是使用 Clang 3.4 编译。
#include <iostream>
#include <array>
struct A {
std::array<char, 4> x;
A(std::array<char, 4> arr) : x(arr) {}
};
int main() {
// works with Clang 3.4, error in GCC 4.8.
// It should be the equivalent of "A a ({'b','u','g','\0'});"
A a ({"bug"});
for (std::size_t i = 0; i < a.x.size(); ++i)
std::cout << a.x[i] << '\n';
return 0;
}
在第一印象中,它看起来像一个 GCC 错误。我觉得它应该可以编译,因为我们可以直接用字符串初始化 std::array<char, N>。例如:
std::array<char, 4> test = {"bug"}; //works
我很想看看标准对此有何评论。
【问题讨论】:
-
使用 clang 3.5 (trunk 200501) 和
-Wall -Wextra干净地编译并按预期工作。 error messages with gcc online. -
FWIW,
A a (std::array<char, 4>{"bug"});被 GCC 接受,因此“没有已知的参数 1 从 '' 到 'std::array ' 的转换”看起来对我来说很奇怪。 -
我不明白为什么 {{"bug"}} 有效,您要求的是 4 大小的 char 数组,而不是字符串(这是另一种野兽)。也许clang很聪明并修复了用户的代码
-
标准中有一条特殊规则允许您从字符串文字初始化
char[N]。我认为这条规则正在发挥作用。 See here.
标签: c++ gcc c++11 compiler-bug stdarray