在查看另一个问题时我遇到了这段代码的变体(原始代码使用的是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
)或只是一个普通的错误?
我认为这是一个错误。
#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)
产生(预期的)错误。