При использовании braced-init-list, содержащего несколько braced-init-list, какие правила определены стандартом для B, C и D?
Для B, я полагаю, что этот сценарий определен в стандарте как фигурный список инициализации с одним элементом, и поэтому он вызывает Test(int)
напрямую, без временного - но я не могу найти где.
Для C и D я не уверен, является ли это неопределенным поведением или нет.
Меня также интересует, что происходит, когда используется более одного элемента, т.е. {{{1, 2}}}
и меняет ли это поведение для B, C или D?
#include <iostream>
struct Test {
Test(const int a) {
// A and B call this
}
Test(Test&& test) = delete;
Test(const Test& test) = delete;
};
int main()
{
Test a{1}; // calls Test(int)
Test b{{2}}; // B
Test c{{{3}}}; // C
Test d{{{{4}}}}; // D
// Test e{a}; error, deleted copy constructor
// Test f{Test{0}}; error, deleted move constructor
return 0;
}
GCC g++ my_prog.cpp
выдает ошибку только для C и D:
my_prog.cpp: In function 'int main()':
my_prog.cpp:16:17: error: too many braces around initializer for 'int' [-fpermissive]
Test c{{{3}}};
^
my_prog.cpp:4:14: note: initializing argument 1 of 'Test::Test(int)'
Test(int a) {
~~~~^