c++ - 包含 std::queue 的类的值初始化

标签 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 中,没有警告。

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

最佳答案

事实上,这在发布的标准下是不正确的,该标准描述了具有显式默认构造函数的 queue

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

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

关于c++ - 包含 std::queue 的类的值初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46537743/

相关文章:

c++ - #include - XCode 中的括号与引号?

assembly - 强制 arm64 gcc 使用指令构造 double float ,无 .rodata 部分

java - 在 LINKEDLIST 制作的 QUEUE 中使用什么来代替 NULL

java - 从 Java BlockingQueue 并发按顺序处理工作项

c++ - 如何将字符串的所有单词写入不同的变量?

带有字符串函数的c++类实现

python - 安装 Ta-lib 会产生 gcc 错误

f# - 如何在 F# 中使我的队列线程安全(并发)

c++ - 在现代 C++11/C++14/C++17 和 future 的 C++20 中枚举到字符串

c++ - 在C++中使用kinect拾取2个手势