这是一个 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
指定显式初始值设定项,它是从一个空的初始值设定项列表复制初始化的,因为复制列表初始化选择了一个显式构造函数,所以它的格式不正确。
GCC 7 为 queue
提供了一个非显式的默认构造函数(无论如何都应该如此),这就是您没有看到错误的原因。同样,libc++ 的 queue
的默认构造函数一直是非显式的。
关于c++ - 包含 std::queue 的类的值初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46537743/