M.M*_*M.M 12 c++ queue gcc c++14
这是一个MCVE:
#include <queue>
struct S
{
std::queue<int> q;
int r;
};
int main()
{
S s{};
}
Run Code Online (Sandbox Code Playgroud)
使用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 ^
Run Code Online (Sandbox Code Playgroud)
在gcc 7.x或clang中,没有警告.
我的问题是:这段代码是否真的正确无误; 如果它是正确的,有什么警告试图警告我的确切?
T.C*_*.C. 15
事实上,这在已公布的标准下是不正确的,该标准queue用明确的默认构造函数描述.
S是一个集合; S s{};是聚合初始化,不调用默认构造函数S.相反,由于没有为其指定显式初始化程序q,因此它是从空的初始化程序列表中复制初始化的,这是一个格式错误,因为复制列表初始化选择了一个显式构造函数.
GCC 7给出了queue一个非显式的默认构造函数(无论如何它应该是这样),这就是为什么你没有看到错误.类似地,libc ++的默认构造函数queue一直是非显式的.
| 归档时间: |
|
| 查看次数: |
572 次 |
| 最近记录: |