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

direct 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)
Разное
Ассемблерные вставки
 
Инициализирует объект из множества явных аргументов конструктора.
Оригинал:
Initializes an object from explicit set of constructor arguments.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

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

T object ( arg );

T object ( arg1, arg2, ... );

(1)
T object { arg };

T object { arg1, arg2, ... };

(2) (начиная с C++11)
T ( other )

T ( arg1, arg2, ... );

(3)
static_cast< T >( other ) (4)
new T(args, ...) (5)
Class::Class() : member(args, ...) {... (6)
[arg](){... (7) (начиная с C++11)

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

Прямая инициализация выполняется в следующих ситуациях:
Оригинал:
Direct initialization is performed in the following situations:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
1)
Инициализация с непустым скобки список выражений
Оригинал:
initialization with a nonempty parenthesized list of expressions
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
во время выполнения последовательности Список инициализации, если не инициализатор-лист constuctors предоставляются и соответствие конструктор доступен, и все необходимые неявные преобразования не являются сужение.
Оригинал:
during Список инициализации sequence, if no initializer-list constuctors are provided and a matching constructor is accessible, and all necessary implicit conversions are non-narrowing.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
3)
инициализации prvalue временными по функциональный оттенок или выражение в скобках список
Оригинал:
initialization of a prvalue temporary by функциональный оттенок or with a parenthesized expression list
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
4)
инициализации prvalue временными по static_cast expession
Оригинал:
initialization of a prvalue temporary by a static_cast expession
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
5)
инициализации объекта с динамическим срок хранения новой выражения с непустым инициализатор
Оригинал:
initialization of an object with dynamic storage duration by a new-expression with a non-empty initializer
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
6)
инициализации базы или не статические члены конструктором инициализатор список
Оригинал:
initialization of a base or a non-static member by constructor инициализатор список
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
7)
инициализации закрытия объекта члена от переменных пойман экземпляр в лямбда-выражения
Оригинал:
initialization of closure object members from the variables caught by copy in a lambda-expression
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Влияние прямых инициализации являются:
Оригинал:
The effects of direct initialization are:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если T это класс, конструкторы T рассматриваются и лучший матч выбирается разрешение перегрузки. Конструктор затем вызывается для инициализации объекта.
    Оригинал:
    If T is a class type, the constructors of T are examined and the best match is selected by overload resolution. The constructor is then called to initialize the object.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • В противном случае, если T не является классом, стандартные преобразования используется, если необходимо, чтобы преобразовать значение other к CV-неквалифицированным версия T.
    Оригинал:
    Otherwise, if T is a non-class type, стандартные преобразования are used, if necessary, to convert the value of other to the cv-unqualified version of T.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

Прямая инициализация больше прав, чем копирование инициализации: копия инициализации рассматривает только без явных конструкторов и определяемые пользователем функции преобразования, в то время как прямой инициализации считает, что все конструкторы и неявные преобразования последовательностей.
Оригинал:
Direct-initialization is more permissive than copy-initialization: copy-initialization only considers non-explicit constructors and user-defined conversion functions, while direct-initialization considers all constructors and implicit conversion sequences.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

#include <string>
#include <iostream>
#include <memory>
 
struct Foo {
    int mem;
    explicit Foo(int n) : mem(n) {}
};
 
int main()
{
    std::string s1("test"); // constructor from const char*
    std::string s2(10, 'a');
 
    std::unique_ptr<int> p(new int(1)); // OK: explicit constructors allowed
//  std::unique_ptr<int> p = new int(1); // error: constructor is explicit
 
    Foo f(2); // f is direct-initialized:
              // constructor parameter n is copy-initialized from the rvalue 2
              // f.mem is direct-initialized from the parameter n
//  Foo f2 = 2; // error: constructor is explicit
 
    std::cout << s1 << ' ' << s2 << ' ' << *p << ' ' << f.mem  << '\n';
}

Вывод:

test aaaaaaaaaa 1 2

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