这是一个MCVE:
#include <queue>
struct S
{
std::queue<int> q;
int r;
};
int main()
{
S s{};
}
使用gcc 6.x -std=c++14 -pedantic
我收到警告
<source>:11:9: warning: converting to 'std::queue<int>' from initializer list would use explicit constructor 'std::queue<_Tp, _Sequence>::queue(_Sequence&&) [with _Tp = int; _Sequence = std::deque<int, std::allocator<int> >]'
S s{};
^
<source>:11:9: note: in C++11 and above a default constructor can be explicit ^
在gcc 7.x或clang中,没有警告。
我的问题是:这段代码是否真的正确无误;如果它是正确的,有什么警告试图警告我确切的?
答案 0 :(得分:16)
事实上,这是在已发布的标准下形成的,它使用显式默认构造函数描述queue
。
S
是一个汇总; S s{};
是聚合初始化,不会调用S
的默认构造函数。相反,由于没有为q
指定显式初始值设定项,因此它是从空的初始化列表中复制初始化的,因为复制列表初始化选择了一个显式构造函数,因此格式错误。
GCC 7给了queue
一个非显式的默认构造函数(无论如何它应该是这样),这就是你没有看到错误的原因。同样,libc ++的queue
的默认构造函数一直是非显式的。