【发布时间】:2014-06-24 05:24:17
【问题描述】:
我在看另一个问题时遇到了这段代码的变体(原始代码使用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;
}
这段代码不应该编译; std::vector<double> vecs[10] = std::vector<double>(10, 1); 不是有效的初始化语法,clang 用error: array initializer must be an initializer list 拒绝它。但是,GCC accepts it 似乎使用指定临时的副本初始化列表中的每个向量。
这是我从未听说过的一些 GCC 扩展(不知何故也设法幸存了-pedantic-errors)还是只是一个普通的错误?
【问题讨论】:
-
我猜是语言标准的差异?
-
@JonathonReinhart 两者都处于 C++11 模式,并且 AFAIK 该语法在 C++ 中从未合法。
-
这不是here提到的(2)填充构造函数吗? 编辑:啊,没关系,错过了变量声明中的数组。
-
@JonathonReinhart 是的,这是一个有效的构造函数,问题是尝试使用它来初始化数组。那不应该编译。
-
最小示例:
struct a {a();} x[2] = a();。 gcc 编译它。没有构造函数声明,它不会。显然是一个错误。