Pertanyaan Inisialisasi nilai dari kelas yang berisi std :: queue


Berikut ini MCVE:

#include <queue>

struct S
{
    std::queue<int> q;
    int r;
};

int main()
{
    S s{};
}

Dengan gcc 6.x -std=c++14 -pedantic Saya mendapat peringatan

<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            ^

Di gcc 7.x, atau dentang, tidak ada peringatan.

Pertanyaan saya adalah: Apakah kode ini benar atau tidak; dan jika itu benar, apa peringatan yang berusaha memperingatkan saya tentang tepatnya?


12
2017-10-03 05:29


asal


Jawaban:


Hal ini, pada kenyataannya, tidak sesuai dengan standar yang dipublikasikan, yang menggambarkan queue dengan konstruktor default eksplisit.

S merupakan agregat; S s{}; adalah inisialisasi agregat dan tidak memanggil konstruktor default S. Sebaliknya, karena tidak ada penginisialisasi eksplisit yang ditentukan untuk q, itu salinan-diinisialisasi dari daftar initializer kosong, yang sakit-dibentuk karena copy-daftar-inisialisasi dipilih konstruktor eksplisit.

GCC 7 memberi queue konstruktor default non-eksplisit (yang bagaimana seharusnya itu), itulah mengapa Anda tidak melihat kesalahan. Demikian pula, konstruktor default dari libc ++ queue selalu tidak eksplisit.


16
2017-10-03 05:57