考虑以下方案:
#include <array>
int main()
{
std::array<int, 1> x = { 0 }; // warning!
x = { { 0 } }; // no warning
return 0;
}
第一个初始化导致对gcc 4.7.2的警告.
main.cpp:5:22: warning: unused variable ‘x’ [-Wunused-variable]
..。和clang 3.1
main.cpp:5:28: warning: suggest braces around initialization of subobject [-Wmissing-braces]
std::array<int, 1> x = { 0 };
就标准而言,双大括号和单花括号之间应该没有区别,至少在这个例子中是这样的。
有两种处理警告的方法:
你有什么建议?这双卷曲的表情看上去有点难看。另一方面,在更复杂的例子中,警告可能会发现真正的问题。你知道这个警告对你有帮助的例子吗?
发布于 2012-12-16 20:59:15
(for C++ mode), as of 4.8, for precisely the reason you describe.对于GCC的当前版本,无论是禁用还是忽略警告,您所拥有的代码都是按其应有的方式编写的。
警告可能是为了涵盖代码,例如
struct A { int a; int b; };
struct B { A a; int b; };
B b = {
1,
2 // initialises b.a.b, not b.b
};
但是,-Wmissing-field-initializers
已经很好地处理了IMHO,它不警告您的原始代码。
发布于 2015-03-09 07:05:39
我在Xcode 6.1.1 (截至2015年3月9日的当前版本)中得到了同样的警告。当我在每个子对象周围加上额外的大括号时,我会得到一个错误。当我在整个初始化列表周围添加一组额外的大括号时,警告就会消失。根据14882:201123.3.2.1标准规范,array.overview第2小节明确声明
array<T, N> a = { initializer-list };
其中,初始化程序列表是最多N个元素的逗号分隔列表,其类型可转换为T。
Xcode 6.1.1中的代码结果(下文)
array<int, 2> key1 = {1, 2}; // warning: suggest braces around initialization of subobject
array<int, 2> key2 = { {1}, {2} }; // error: no viable overload =
array<int, 2> key3 = array<int, 2> { {1}, {2} }; // error: excess elements in struct initializer
array<int, 2> key4 = { {1, 2} }; // no warning and no error
当我们查看14882:20118.5 dcl.init小节1时,我们可以看到‘初始化程序-列表’可以选择地包含‘初始化-子句’,它本身可以是‘大括号-init-列表’。所以这两种方法都应该是正确的。尽管基于规范,我个人认为单个大括号不应该输出对std::数组初始化程序列表和双大括号的编译器警告。
发布于 2018-01-24 02:18:13
Clang6.0取消了关于缺少大括号的警告。svn日志显示:
当聚合-用本身是聚合的单个字段初始化一个结构时,会出现警告。在C++中,这种std::数组类型的初始化按照标准保证工作,完全是惯用的,而Clang的“建议”替代方案在技术上是无效的。
因此,如果需要支持,我将省略大括号,并在6.0之前禁用-Wmissing-braces
for Clang。
https://stackoverflow.com/questions/13905200
复制相似问题