Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 12.12.2022
Сообщений: 15

Копирующая инициализация

08.01.2023, 00:07. Показов 2193. Ответов 26

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
class A {
    int _x;
public:
    A(int x) : _x(x) {}
 
};
 
int main()
{
    A s = 2; // вот она
}
Я не понимаю как это работает? Так как копирующая инициализация инициализирует объект из другого объекта, компилятор видит литерал int и приводит к типу A, то есть в теории должен вызваться конструктор для создания анонимного объекта, что бы потом вызвать конструктор копирования и инициализировать объект s анонимным объектом? Получается что это будет выглядеть так: A s = A(2);?

На практике компилятор это все оптимизирует будет вызван один конструктор. Получается если ход мыслей верный, то по этой причине копирующая инициализация носит такое название?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2023, 00:07
Ответы с готовыми решениями:

Функция копирующая нечётные элементы массива
Используя одну функцию, переписать нечётные элементы целочисленных массивов A и B в массив C подряд. Вывести на печать исходные и...

Функция копирующая элементы матрицы в массив по столбцам
Нужна функция, которая будет копировать элементы матрицы в массив по столбцам. Получается только по строкам и никак не могу переделать....

Функция копирующая в отдельные массивы четные и нечетные элементы исходного массива
Здравствуйте! Помогите решить задачку, очень надо. Описать процедуру Split2(A, NA, B, NB, C, NC), формирующую по целочисленному...

26
0 / 0 / 0
Регистрация: 12.12.2022
Сообщений: 15
08.01.2023, 02:36  [ТС]
Студворк — интернет-сервис помощи студентам
DrOffset, A b = 2; Странно в с98 - с11 это приводит к такой записи
C++
1
A b = A(A(2));
, а в с17 как по мне все понятно, это приводит к такой записи
C++
1
A b = A(2);
. Это я не учёл copy elision. Компилятор это оптимизирует и будет A b(2);, а вот в с++98-11 это что такое? Инициализировать анонимный объект, анонимным объектом(который в свою очередь должен вызвать конструктор) конструктором копирования, а потом ещё конструктор копирования что бы инициализировать объект b? Но ведь и до с++17 компилятор мог оптимизировать это все одним конструктором
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.01.2023, 02:49
Цитата Сообщение от ABCS Посмотреть сообщение
Инициализировать анонимный объект, анонимным объектом(который в свою очередь должен вызвать конструктор) конструктором копирования, а потом ещё конструктор копирования что бы инициализировать объект b?
Думаю, что прежде чем продолжать тему, вам нужно разобраться что есть объект и что есть выражение.

Цитата Сообщение от ABCS Посмотреть сообщение
а вот в с++98-11 это что такое?
В С++98 формально требовалась доступность конструктора копирования в этом выражении.
Запись, которую вы привели, отражает это требование.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.01.2023, 12:23
Цитата Сообщение от DrOffset Посмотреть сообщение
Гарантии о copy-elision накладываются уже поверх этих базовых правил.
На деле получается после C++17 инициализацию переместили из времени выполнения во время компиляции?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
08.01.2023, 13:44
_stanislav, как-то это очень противоречиво звучит.
На деле скорее навели порядок с материализацией временных объектов в этом случае.
Вот, можешь почитать об изменениях:
https://www.open-std.org/jtc1/... 135r0.html
https://www.open-std.org/jtc1/... 135r1.html
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
08.01.2023, 13:56
Цитата Сообщение от DrOffset Посмотреть сообщение
как-то это очень противоречиво звучит.
Ну я имел ввиду, что инициализация происходит раньше, убрали избыточную семантику.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
21.03.2023, 21:24
Цитата Сообщение от DrOffset Посмотреть сообщение
На деле скорее навели порядок с материализацией временных объектов в этом случае.
Copy elision работает через Temporary materialization или я опять перепутал все...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
22.03.2023, 00:26
Как вам уже объяснили, начиная с С++17 "физическая" разница между A s = 2 и A s(2) полностью исчезла. Однако чисто умозрительные различия и связанные с ними ограничения все равно сохраняются. Например, даже в современном С++ первый вариант не является корректным, если конструктор преобразования объявлен как explicit.

Добавлено через 3 минуты
Цитата Сообщение от ABCS Посмотреть сообщение
A b = 2; Странно в с98 - с11 это приводит к такой записи
C++
1
A b = A(A(2));
Это где это вам удалось наблюдать такое нагромождение копирований в с98 - с11?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2023, 00:26

Программа копирующая 1 строку с сайта
Есть сайт ,а точнее личный кабинет интернет провайдера. Хочу написать программу которая будет входить на сайт (вводить логин пароль и...

Программа, копирующая текст
Помогите, пожалуйста, с программой, которая копирует все комментарии из файла file.cpp в файл file1.txt, а оставшийся текст – в файл...

Программа, копирующая сама себя
Нужно, чтобы программа скопировала сама себя в определенную папку. Если есть идеи, прошу отписать сюда.

Функция копирующая в другой массив элементы кратные 5
Для массивов B (3,3) и C (4,4) напишите программу, которая копирует значение 5 в массив A элементов, которые делятся безостатков. Пусть из...

Программа, копирующая текст и комментарии в разные файлы
В общем, программа считывает сpp-файл и записывает из него все комментарии в один текстовый файл, а текст - в другой. Мне более-менее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru