【发布时间】:2015-09-06 17:19:34
【问题描述】:
当我用 CLANG 编译以下代码时:
#include <iostream>
#include <array>
#include <algorithm>
#include <functional>
int main() {
std::array<int, 2> a = {1, 2};
std::array<int, 2> b = {2, 1};
std::array<int, 2> c;
std::transform(a.begin(), a.end(), b.begin(), c.begin(), std::multiplies<int>());
for(auto &&i : c) std::cout << i << " ";
std::cout << std::endl;
}
通过发出命令:
clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp
它发出警告:
警告:建议在子对象初始化周围使用大括号 [-Wmissing-braces]
但是,GCC 编译该程序时根本不会发出警告。
问:
- 哪个编译器是正确的?
- Clangs 警告我的原因是什么?
【问题讨论】:
-
这是一个警告;他们都是对的。 GCC 还使用
-Wmissing-braces发出警告。 -
有一篇很好的回顾帖子,涵盖了
=、{、{等所有可能的组合,但我现在找不到。令人烦恼的是,std::array不需要在内部使用 C 样式的数组,因此双括号版本不正确。
标签: c++ c++11 gcc clang stdarray