包含std ::队列的类的价值限制

Value-initialization of class containing std::queue

本文关键字:队列 包含 std      更新时间:2023-10-16

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

我的问题是:此代码实际上是否正确;如果是正确的话,试图确切警告我的警告是什么?

实际上,这是根据已发布的标准形式不良的,它用明确的默认构造函数描绘queue

S是一个聚合;S s{};是汇总初始化,并且不调用S的默认构造函数。相反,由于未针对q指定明确的初始化器,因此它是从一个空的初始化器列表中进行了委员会化的,该列表不正确,因为复制列表initialization选择了一个显式构造函数。

gcc 7给了 queue一个非明确的默认构造函数(无论如何应该是这样),这就是为什么您看不到错误的原因。同样,libc 的 queue的默认构造函数始终是不明显的。