Пространства имён
Варианты
Действия

list initialization

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Инициализирует объект из фигурных-Init-списка
Оригинал:
Initializes an object from braced-init-list
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

[править] Синтаксис

T object { arg1, arg2, ... }; (1)
T { arg1, arg2, ... }; (2)
new T { arg1, arg2, ... }; (3)
return { arg1, arg2, ... } ; (4)
function( { arg1, arg2, ... } ) ; (5)
object[ { arg1, arg2, ... } ] ; (6)
T( { arg1, arg2, ... } ) (7)
Class { T member = { arg1, arg2, ... }; }; (8)
Class::Class() : member{arg1, arg2, ...} {... (9)
T object = {arg1, arg2, ...}; (10)

[править] Объяснение

Список инициализация выполняется в следующих ситуациях:
Оригинал:
List initialization is performed in the following situations:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
1)
инициализации переменной с именем фигурные скобки список выражений или вложенные списки (приготовился-INIT-лист)
Оригинал:
initialization of a named variable with a brace-enclosed list of expressions or nested lists (braced-init-list)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
инициализации неназванный с временным приготовился-Init-лист
Оригинал:
initialization of an unnamed temporary with a braced-init-list
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3)
инициализации объекта с динамическим срок хранения с новой выражения, где инициализатор фигурные инициализации списка
Оригинал:
initialization of an object with dynamic storage duration with a new-expression, where the initializer is a brace-init-list
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
4)
В return заявление с вычисляемых-INIT-лист используется в качестве возвращаемого выражением
Оригинал:
in a return statement with braced-init-list used as the return expression
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5)
В выражении вызова функции, с приготовился-INIT-лист используется в качестве аргумента
Оригинал:
in a function call expression, with braced-init-list used as an argument
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
6)
В индексного выражения с определенной пользователем оператора []
Оригинал:
in a subscript expression with a user-defined operator[]
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
7)
В функциональное выражение литые или других прямых инициализации, с приготовился-Init-лист используется в качестве аргумента конструктора
Оригинал:
in a functional cast expression or other direct-initialization, with braced-init-list used as the constructor argument
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
8)
в не-статический инициализатор элемента данных
Оригинал:
in a non-static data member initializer
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
9)
В списке инициализации конструктора
Оригинал:
in a constructor initializer list
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
10)
на правой стороне от знака равенства (по аналогии с Копия инициализации)
Оригинал:
on the right-hand-side of the equals sign (similar to Копия инициализации)
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Последствия список инициализации объекта типа T являются:
Оригинал:
The effects of list initialization of an object of type T are:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если фигурных-Init-список пуст и T это класс с конструктором по умолчанию, Значение инициализации выполняется.
    Оригинал:
    If the braced-init-list is empty and T is a class type with a default constructor, Значение инициализации is performed.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • В противном случае, если T является специализацией std::initializer_list, новый объект std::initializer_list того же типа, построено и используется для направления инициализации или скопировать инициализировать объект типа T, в зависимости от контекста.
    Оригинал:
    Otherwise, if T is a specialization of std::initializer_list, a new std::initializer_list object of the same type is constructed and used to direct-initialize or copy-initialize the object of type T, depending on context.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • В противном случае, constuctors из T считается, в два этапа:
    Оригинал:
    Otherwise, the constuctors of T are considered, in two phases:
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Все конструкторы, которые принимают std::initializer_list в качестве единственного аргумента, или в качестве первого аргумента, если остальные аргументы имеют значения по умолчанию, рассматриваются, и сопровождается перегрузкой резолюции против одного аргумента типа std::initializer_list
    Оригинал:
    All constructors that take std::initializer_list as the only argument, or as the first argument if the remaining arguments have default values, are examined, and matched by overload resolution against a single argument of type std::initializer_list
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если на предыдущем этапе не производит матч, все конструкторы T участие в разрешении перегрузки с набором аргументов, которые состоят из элементов из фигурных-Init-лист, с тем ограничением, что только сужающими не допускается. Если эта стадия создает явный конструктор, как наиболее подходящий для копирования списка инициализации, компиляция не удается (к сведению, в простое копирование инициализации, явные конструкторы вообще не рассматриваются)
    Оригинал:
    If the previous stage does not produce a match, all constructors of T participate in overload resolution against the set of arguments that consists of the elements of the braced-init-list, with the restriction that only narrowing conversions are allowed. If this stage produces an explicit constructor as the best match for a copy-list-initialization, compilation fails (note, in simple copy-initialization, explicit constructors are not considered at all)
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • В противном случае, если T является ссылочным типом, prvalue временное из указанного типа является список инициализации, и ссылка на связанный с этим временное.
    Оригинал:
    Otherwise, if T is reference type, a prvalue temporary of the referenced type is list-initialized, and the reference is bound to that temporary.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Сужение преобразований

Список инициализации ограничивает разрешенные неявные преобразования, запрещая следующие:
Оригинал:
list-initialization limits the allowed неявные преобразования by prohibiting the following:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • преобразование из типа с плавающей точкой в ​​целое число типа
    Оригинал:
    conversion from a floating-point type to an integer type
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Переход от long double в double или float и преобразования из double в float, кроме случаев, когда источником является постоянное выражение, значение которого может быть сохранен именно в целевой тип
    Оригинал:
    conversion from a long double to double or to float and conversion from double to float, except where the source is a constant expression whose value can be stored exactly in the target type
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • преобразование из целых или незаданной типа перечисления в целый тип, который не может представлять все значения оригинального, кроме случаев, когда источником является постоянным выражением, значение которого может быть сохранен именно в целевой тип
    Оригинал:
    conversion from integer or unscoped enumeration type to integer type that cannot represent all values of the original, except where source is a constant expression whose value can be stored exactly in the target type
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Заметки

Скрепленные-Init-список не является выражением и не имеет типа по себе: например, при вызове функции шаблона, подтянул-Init-список аргументов не может быть использована для шаблона вычета типа. Специальное исключение сделано для ключевого слова auto, которая выводит любую приготовился-Init-список, как std::initializer_list.
Оригинал:
Braced-init-list is not an expression and has no type on its own: for example, when calling a function template, braced-init-list argument cannot be used for template type deduction. A special exception is made for the keyword auto, which deduces any braced-init-list as std::initializer_list.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Пример

#include <iostream>
#include <vector>
#include <map>
#include <string>
 
struct Foo {
    std::vector<int> mem = {1,2,3}; // list-initialization of a non-static member
    std::vector<int> mem2;
    Foo() : mem2{-1, -2, -3} {} // list-initialization of a member in constructor
};
 
std::pair<std::string, std::string> f(std::pair<std::string, std::string> p)
{
    return {p.second, p.first}; // list-initialization in return statement
}
 
int main()
{
    int n0{};     // value-initialization (to zero)
    int n1{1};    // direct-list-initialization
    std::string s1{'a', 'b', 'c', 'd'}; // initializer-list constructor call
    std::string s2{s1, 2, 2};           // regular constructor call
    std::string s3{0x61, 'a'}; // initializer-list ctor is preferred to (int, char)
 
    int n2 = {1}; // copy-list-initialization
    double d = double{1.2}; // list-initialization of a temporary, then copy-init
 
    std::map<int, std::string> m = { // nested list-initialization
           {1, "a"},
           {2, {'a', 'b', 'c'} },
           {3, s1}
    };
 
    std::cout << f({"hello", "world"}).first // list-initialization in function call
              << '\n';
 
    const int (&ar)[2] = {1,2}; // binds a lvalue reference to a temporary array
    int&& r1 = {1}; // binds a rvalue reference to a temporary int
//  int& r2 = {2}; // error: cannot bind rvalue to a non-const lvalue ref
 
//  int bad{1.0}; // error: narrowing conversion
    unsigned char uc1{10}; // okay
//  unsigned char uc2{-1}; // error: narrowing conversion
 
    Foo f;
 
    std::cout << n0 << ' ' << n1 << ' ' << n2 << '\n'
              << s1 << ' ' << s2 << ' ' << s3 << '\n';
    for(auto p: m)
        std::cout << p.first << ' ' << p.second << '\n';
    for(auto n: f.mem)
        std::cout << n << ' ';
    for(auto n: f.mem2)
        std::cout << n << ' ';
}

Вывод:

world
0 1 1
abcd cd aa
1 a
2 abc
3 abcd
1 2 3 -1 -2 -3


[править] См. также