非平凡结构的大括号初始化会导致意外行为

Som*_*ild 3 c++

在附加的代码片段中,我预计:std::vector<C> d = { {} };会导致编译器错误,因为B无法默认构造。那么如果没有错误,我希望d.size()1。这是意外行为还是我错过了一些不言而喻的事情?

#include <array>
#include <algorithm>
#include <iostream>
#include <vector>

struct A {};

struct B {
    B( int ) {}
};

struct C {
    A a;
    B b;
};


int main() {
    ::std::vector<C> d = { {} }; //ok?!?!
    //::std::vector<C> d2 = { C() }; Error
    //C c; Error
    //d.push_back( {} ); Error
    //d.push_back( { {}, { 3 } } ); Ok

    return d.size(); // 0 instead of expected 1
}
Run Code Online (Sandbox Code Playgroud)

Kam*_*Cuk 8

::std::vector<C> d = { {} };
Run Code Online (Sandbox Code Playgroud)

正在调用https://en.cppreference.com/w/cpp/container/vector/vector的第 10 个构造函数:

vector( std::initializer_list<T> init,
       const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)

内部{}是空的std::initializer_list,外部{ }复制列表初始化形式 6

专业提示:使用正确配置的 IDE,您可以“转到符号的定义”。我将光标放在第一个上{,然后单击“转到定义”,然后我的 IDE 使用初始化器列表跳转到正确的向量构造函数。将光标放在第二个{并“转到定义”,跳转到initializer_list构造函数。