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

copy 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 another object
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

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

T object = other ; (1)
f(other); (2)
return other; (3)
catch ( T other) ; (4)
T array [ N ] = { other }; (5)

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

Копировать инициализация выполняется в следующих ситуациях:
Оригинал:
Copy initialization is performed in the following situations:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
1)
При именем переменной (автоматические, статические, или поток-местный) объявляется с помощью инициализатора, состоящая из знака равенства, за которым следует выражение.
Оригинал:
when a named variable (automatic, static, or thread-local) is declared with the initializer consisting of an equals sign followed by an expression.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
при переходе аргумента функции по значению
Оригинал:
when passing an argument to a function by value
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
3)
при возвращении из функции, которая возвращает по значению
Оригинал:
when returning from a function that returns by value
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
4)
при ловле исключения по значению
Оригинал:
when catching an exception by value
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
5)
как часть совокупный инициализации, для инициализации каждого элемента, для которого инициализатор предоставляется
Оригинал:
as part of совокупный инициализации, to initialize each element for which an initializer is provided
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Последствия копию инициализации являются:
Оригинал:
The effects of copy initialization are:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если T является одним классом и типом other в CV-неквалифицированным версия T или класса, производного от T, конструкторы T рассматриваются и лучший матч выбирается разрешение перегрузки. Конструктор затем вызывается для инициализации объекта.
    Оригинал:
    If T is a class type and the type of other is cv-unqualified version of T or a class derived from T, 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 Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если T это класс, тип, и тип other разные, или если T не является классом типа, но тип other это класс, пользовательского преобразования последовательностей, который может конвертировать от типа other в T рассматриваются и лучшее выбран один через разрешение перегрузки. Результат преобразования, которая является prvalue временного назначения типа, который затем используется для Прямая инициализации объекта. На последнем этапе, как правило, устранены и результат функции преобразования построена непосредственно в памяти, выделенной для целевой объект, но конструктор копии должны быть доступны даже если он не используется.
    Оригинал:
    If T is a class type, and the type of other is different, or if T is non-class type, but the type of other is a class type, пользовательского преобразования последовательностей that can convert from the type of other to T are examined and the best one is selected through overload resolution. The result of the conversion, which is a prvalue temporary of the destination type, is then used to Прямая инициализации the object. The last step is usually устранены and the result of the conversion function is constructed directly in the memory allocated for the target object, but the copy constructor is required to be accessible even though it's not used.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • В противном случае (если ни T, ни тип other относятся к классу типов), стандартные преобразования используется, если необходимо, чтобы преобразовать значение other к CV-неквалифицированным версия T.
    Оригинал:
    Otherwise (if neither T nor the type of other are class types), стандартные преобразования are used, if necessary, to convert the value of other to the cv-unqualified version of T.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

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

Копировать инициализации меньше прав, чем прямая инициализация: копия инициализации рассматривает только без явных конструкторов и определяемые пользователем функции преобразования.
Оригинал:
Copy-initialization is less permissive than direct-initialization: copy-initialization only considers non-explicit constructors and user-defined conversion functions.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Если other является RValue выражения, двигаться конструктор будет выбран разрешение перегрузки и призвали во время копирования инициализации.
Оригинал:
If other is an rvalue expression, двигаться конструктор will be selected by overload resolution and called during copy-initialization.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Знак равенства, =, в копии инициализация имени переменной не связано с оператором присваивания. Перегрузки оператора присваивания не влияет на копию инициализации.
Оригинал:
The equals sign, =, in copy-initialization of a named variable is not related to the assignment operator. Assignment operator overloads have no effect on copy-initialization.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

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

#include <string>
#include <utility>
#include <memory>
 
int main()
{
    std::string s = "test"; // OK: constructor is non-explicit
    std::string s2 = std::move(s); // this copy-initialization performs a move
 
//  std::unique_ptr<int> p = new int(1); // error: constructor is explicit
    std::unique_ptr<int> p(new int(1)); // OK: direct-initialization
 
    int n = 3.14;    // floating-integral conversion
    const int b = n; // const doesn't matter
    int c = b;       // ...either way
}


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