奇怪的GCC数组初始化行为

T.C*_*.C. 20 c++ gcc

在查看另一个问题时我遇到了这段代码的变体(原始代码使用的是std::thread代替std::vector,但语法是相同的):

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<double> vecs[10] = std::vector<double>(10, 1);
    for(auto& vec: vecs){
        std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(std::cout, " "));
        std::cout<<std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码不应该编译; std::vector<double> vecs[10] = std::vector<double>(10, 1);是无效的初始化语法,并且clang拒绝它error: array initializer must be an initializer list.但是,GCC 接受它并且似乎用指定临时副本初始化列表中的每个向量.

这是我从未听说过的一些GCC扩展(以某种方式也设法生存-pedantic-errors)或只是一个普通的错误?

cho*_*ger 4

我认为这是一个错误。

#include <vector>

int main()
{
  std::vector<double> x = std::vector<double>(10, 1);
  std::vector<double> vecs[10] = x;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

有效(正如您所发现的)。

尽管

int main()
{
  int x = 10;
  int is[10] = x;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生(预期的)错误。