当我用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]
但是,海湾合作委员会编制了这个程序而没有发出警告 .
问:
-
哪个编译器是对的?
-
Clangs警告我的原因是什么?
2 回答
在某些情况下,可以省略牙箍 . 这是其中一个案例 . 用于初始化
a
和b
的最外侧大括号是可选的 . 它在语法上都是正确的 - 但它是一个非常有效的警告.1166410_是一个非常有效的警告 . 并且chris指出,使用-Wmissing-braces
,gcc会发出相同的警告 . 最终,两个编译器都接受了正确的代码;毕竟,这是一个有效的计划 . 这一切都很重要 .来自[dcl.init.aggr]:
两个编译器都是对的 . Brace-elision是一种允许聚合由一对大括号初始化的功能 . 每个成员子项目都根据需要初始化为尽可能多的初始化子句 . 这是为了允许更方便的初始化形式 .
Clang通过警告你是有帮助的,因为虽然你能够忽略大括号,但如果你不小心的话,并不总是清楚如何初始化聚合 . 您必须确定哪些初始化子句与哪些成员子对象相关 .