Visual C++初始化与gcc和clang不一致
Visual C++ initialization inconsistence with gcc and clang
以下代码打印用vc++编译的0
和用g++或clang++编译的1
:
#include <iostream>
#include <vector>
struct S
{
S() = default;
std::vector<int> v{0};
};
int main()
{
std::vector<S> s{{}};
std::cout << s.front().v.size() << std::endl;
}
这是vc++中的错误吗?
如果提供了用户定义的构造函数(S() {};
而不是S() = default;
(vc++也开始打印1
。
在阅读标准(C++11 n3485(时,12.6.2/9
声明:
如果给定的非静态数据成员同时具有
brace-or-equal-initializer
和mem-initializer
,则执行由mem-initializer
指定的初始化,并且忽略该非静态数据会员的brace-or-equal-initializer
。
因此,问题变成了default
,即隐式定义的构造函数是否包含mem-initializer
。
12.1/6
节规定:
隐式定义的默认构造函数执行类的初始化集,该初始化集将由用户为没有
ctor-initializer
(12.6.2(和空compound-statement
的类编写的默认构造函数来执行。
这意味着隐式生成的(默认(构造函数没有mem-initializer
s,实际上应该使用类内初始值设定项(上面引用的brace-or-equal-initializer
(。
微软风投在这里错了(真的,这并不奇怪(。
这不是一个答案,而是一个需要代码的注释。
以下更清楚地说明了编译器的差异,我认为:
#include <iostream>
#include <vector>
struct S
{
S() = default;
std::vector<int> v = std::vector<int>(13);
};
int main()
{
std::vector<S> s{{}};
std::cout << s.front().v.size() << std::endl;
}
g++MinGW 5.1.0报告了13项,而MSVC 2015更新2报告了0项。
即g++使用类中指定的初始值设定项,而MSVC使用s
声明中指定的初始化项。在我看来,这似乎是g++的一个问题。但我不确定:唯一确定的是两者都不可能是对的。
相关文章:
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么 Clang 不允许"and"作为函数名称?
- 在 C++(和 C)中进行类型转换时明显不一致
- 填充上编译器生成的复制构造函数之间的不一致
- 为什么 Clang 不喜欢__DATE__宏?
- 犰狳的 print() 方法和 cout 在从 Rcpp 调用时顺序不一致
- CreateDIBSection为同一图像返回不一致的位图位值
- GCC/CLang不同意模板模板参数的部分特化
- 在 Qml 中从 QSqlTableModel 中删除单行时视图不一致
- 模板参数推导不一致
- 声明中不一致的no是否违反ODR?
- 如何删除分支因子不一致的树,最大为 30,40
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 当指定初始化程序的顺序和字段声明不一致时,clang可以删除函数调用
- GCC和Clang之间的C 不一致
- MSVC和Clang之间的大括号不一致或初始化行为相等
- c++ 11构造函数重载解析和initialiser_lists: clang++和c++不一致.< / h1 &
- 类中定义的友元函数模板是否可用于查找?clang++和g++不一致
- struct和int之间clang中的重新定义不一致
- Visual C++初始化与gcc和clang不一致