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

copy initialization

Материал из cppreference.com

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор 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)
Разное
Ассемблерные вставки
 
Инициализирует объект из другого объекта
Original:
Initializes an object from another object
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

Содержание

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

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

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

Копировать инициализация выполняется в следующих ситуациях:
Original:
Copy initialization is performed in the following situations:
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
1)
При именем переменной (автоматические, статические, или поток-местный) объявляется с помощью инициализатора, состоящая из знака равенства, за которым следует выражение.
Original:
when a named variable (automatic, static, or thread-local) is declared with the initializer consisting of an equals sign followed by an expression.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
2)
при переходе аргумента функции по значению
Original:
when passing an argument to a function by value
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
3)
при возвращении из функции, которая возвращает по значению
Original:
when returning from a function that returns by value
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
4)
при ловле исключения по значению
Original:
when catching an exception by value
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
5)
как часть совокупный инициализации, для инициализации каждого элемента, для которого инициализатор предоставляется
Original:
as part of совокупный инициализации, to initialize each element for which an initializer is provided
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Последствия копию инициализации являются:
Original:
The effects of copy initialization are:
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
  • Если T является одним классом и типом other в CV-неквалифицированным версия T или класса, производного от T, конструкторы T рассматриваются и лучший матч выбирается разрешение перегрузки. Конструктор затем вызывается для инициализации объекта.
    Original:
    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.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • Если T это класс, тип, и тип other разные, или если T не является классом типа, но тип other это класс, пользовательского преобразования последовательностей, который может конвертировать от типа other в T рассматриваются и лучшее выбран один через разрешение перегрузки. Результат преобразования, которая является prvalue временного назначения типа, который затем используется для Прямая инициализации объекта. На последнем этапе, как правило, устранены и результат функции преобразования построена непосредственно в памяти, выделенной для целевой объект, но конструктор копии должны быть доступны даже если он не используется.
    Original:
    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.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.
  • В противном случае (если ни T, ни тип other относятся к классу типов), стандартные преобразования используется, если необходимо, чтобы преобразовать значение other к CV-неквалифицированным версия T.
    Original:
    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.
    The text has been machine-translated via Google Translate.
    You can help to correct and verify the translation. Click here for instructions.

[править] Notes

Копировать инициализации меньше прав, чем прямая инициализация: копия инициализации рассматривает только без явных конструкторов и определяемые пользователем функции преобразования.
Original:
Copy-initialization is less permissive than direct-initialization: copy-initialization only considers non-explicit constructors and user-defined conversion functions.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Если other является RValue выражения, двигаться конструктор будет выбран разрешение перегрузки и призвали во время копирования инициализации.
Original:
If other is an rvalue expression, двигаться конструктор will be selected by overload resolution and called during copy-initialization.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Знак равенства, =, в копии инициализация имени переменной не связано с оператором присваивания. Перегрузки оператора присваивания не влияет на копию инициализации.
Original:
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.
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.

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

#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
}


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