Такой код компилируется:
#include
int main(int argc, char* argv[])
{
std::vector
return 0;
}
Почему? Как интерпретируются множественные фигурные скобки? Если бы была одна пара скобок, это был бы initializer_list. А во что преобразуются три пары скобок? И почему именно три, а не больше (в GCC)? (Visual Studio 2013 допускает в этой ситуации произвольное количество скобок.)
Ответ
Все варианты используют конструктор std::vector
В данном случае наличие или отсутствие = в синтаксисе лист-инициализации в первых трех вариантах роли не играет, т.е. никакой разницы в семантике первых двух вариантов нет.
Вариант
std::vector
аналогичен
std::intializer_list
При этом {} является корректным инициализатором для объекта типа int, т.е.
std::intializer_list
в свою очередь аналогично просто
int temp_int = {}; // инициализация нулем
std::intializer_list
std::vector
это, как уже говорилось выше, то же самое, только в синтаксисе прямой лист-инициализации.
В варианте
std::vector
{ 1 } - вполне корректный инициализатор для объекта типа int. Т.е. этот вариант аналогичен
int temp_int = { 1 };
std::intializer_list
std::vector
использует уже конструктор копирования класса std::vector
std::vector
Например, если мы объявим искусственный класс
struct S
{
S(std::initializer_list
то первые три варианта прекрасно скомпилируются и для него, а вот четвертый - откажется компилироваться по причине удаленного конструктора копирования.
Попытки увеличивать количество скобок приводят к формированию неправильного инициализатора на самом нижнем уровне: ни { {} }, ни { { 1 } } уже не являются корректными инициализаторами для объекта типа int. Поэтому код не компилируется. Кстати, у меня и VS2015 отказывается компилировать варианты с увеличенным количеством скобок.
Комментариев нет:
Отправить комментарий