包含std :: queue的类的值初始化

时间:2017-10-03 05:29:40

标签: c++ gcc queue c++14

这是一个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中,没有警告。

我的问题是:这段代码是否真的正确无误;如果它是正确的,有什么警告试图警告我确切的?

1 个答案:

答案 0 :(得分:16)

事实上,这是在已发布的标准下形成的,它使用显式默认构造函数描述queue

S是一个汇总; S s{};是聚合初始化,不会调用S的默认构造函数。相反,由于没有为q指定显式初始值设定项,因此它是从空的初始化列表中复制初始化的,因为复制列表初始化选择了一个显式构造函数,因此格式错误。

GCC 7给了queue一个非显式的默认构造函数(无论如何它应该是这样),这就是你没有看到错误的原因。同样,libc ++的queue的默认构造函数一直是非显式的。