|
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
|
|||||||||||||||||||||
Почему в данном случае срабатывает неявный конструктор15.02.2018, 01:20. Показов 2270. Ответов 20
Метки нет (Все метки)
Почему в данном случае срабатывает неявный конструктор, хотя он и помечен explicit?
Main.cpp:
Взял отсюда: https://stackoverflow.com/ques... 03#4285803. Добавлено через 8 минут После дебага заметил что тут выходит почему-то одновременно с вызовом конструктора:
0
|
|||||||||||||||||||||
| 15.02.2018, 01:20 | |
|
Ответы с готовыми решениями:
20
|
|
Вездепух
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,197
|
||
| 15.02.2018, 01:39 | ||
explicit конструктора. С чего вы взяли, что он у вас "срабатывает"? Где?У вас в коде открытым тестом прописано использование конструктора HugoCopy(Hugo const& hugo) и оператора operator Hugo const&(). А они никакие не explicit.
1
|
||
|
Неэпический
|
||||||
| 15.02.2018, 01:51 | ||||||
|
TheCalligrapher, думаю, он о том, что
1
|
||||||
|
Вездепух
12928 / 6796 / 1819
Регистрация: 18.10.2014
Сообщений: 17,197
|
||
| 15.02.2018, 02:02 | ||
HugoCopy обратно в Hugo делается через operator Hugo const&(), т.е. с преобразованием как таковым проблем нет. У меня этот код прекрасно собирается и в gcc и в clang. Более того, даже если добавить Hugo p = f(); в main, то код собирается gcc в режиме C++17, но не собирается в режиме C++14 (именно из-за конструктора копирования), что по-видимому вызвано guaranteed copy elision в C++17.Добавлено через 3 минуты Хотя да, вижу что конструктор копирования вызывается в gcc...
1
|
||
|
Неэпический
|
||
| 15.02.2018, 02:03 | ||
|
gcc: http://rextester.com/FRWIK38971 vc: http://rextester.com/FNLWAA35042
1
|
||
|
Комп_Оратор)
|
|||||||
| 15.02.2018, 02:09 | |||||||
|
То есть, константная ссылка на локальный объект потребует копирования для возврата из такой функции. Например можно и так написать. Тут явно видно что происходит. Не желает конструктор копии преобразовывать константную ссылку в аргумент требующий Hugo h. Тут конечно забавно всё выглядит так как объявлен то он именно как ссылка на константу. Но объявление ссылки аргумента функции это не объявление типа, а декларация контракта - не менять аргумент. В функции инициализируется ссылка, но ожидается внешний объект. Это поведение касается именно константной ссылки.
![]() Не по теме: Пардон. До моего поста выступлений ещё не было. Впрочем, я уверен в том, что говорю не менее чем обычно. То есть сомневаюсь как всегда. :pardon:
0
|
|||||||
|
41 / 75 / 15
Регистрация: 04.10.2017
Сообщений: 283
|
|
| 15.02.2018, 02:24 | |
|
oobarbazanoo, потому что hugo надо заменить на hoggy.
4
|
|
| 15.02.2018, 02:27 | |
|
0
|
|
|
Неэпический
|
|||
| 15.02.2018, 02:27 | |||
|
TheCalligrapher, в return statement должна быть copy-initialization.
explicit Hugo(Hugo const&) не должен быть кандидатом, но если return HugoCopy(h) собирается, значит в return statement используется не copy-initialization, верно?
1
|
|||
|
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
|
|
| 15.02.2018, 14:46 [ТС] | |
|
tmpValue, почему на hoggy? Не нахожу перевода или значения данного слова. Объясните данный момент, пожалуйста.
Добавлено через 1 минуту Croessmah, в этом то и вопрос. Как? Добавлено через 4 минуты Croessmah, подскажите, пожалуйста, как Вы смогли сделать так, что бы Ваш код сохранился для тех кто перейдёт по ссылке на онлайн компилятор?
0
|
|
|
Неэпический
|
||||
| 15.02.2018, 17:10 | ||||
![]() Добавлено через 1 минуту ![]() Или DrOffset, или ct0r. На удачу позову еще FoReVeR и Tulosba.
1
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 15.02.2018, 19:07 | |
|
1
|
|
|
Комп_Оратор)
|
||||||||||||
| 15.02.2018, 19:16 | ||||||||||||
Оно же и при возврате из функции по значению получается неявным вызовом... Ну то есть, такое чувство, что гарантия что не появится приведение только при вызове:
Понимаю что бредово, но вот как ещё это можно объяснить?
1
|
||||||||||||
|
Неэпический
|
|||
| 15.02.2018, 19:31 | |||
A a(b) explicit конструкторы будут рассматриваться как кандидаты при выборе конструктора, а в copy-initialization A a = b; explicit-конструкторы не являются кандидатами.Добавлено через 44 секунды
0
|
|||
|
Комп_Оратор)
|
|||
| 15.02.2018, 19:42 | |||
A a= b; однозначно эквивалентна A a(a);и не должно быть разницы. Различие то тут (насколько я понимаю) только в синтаксисе, а вызов то однозначен? Просто компиллятору нужно бы быть чуть-чуть умнее. Странно это. Но нужно запомнить.
0
|
|||
|
Комп_Оратор)
|
||
| 15.02.2018, 19:50 | ||
A a=b;должен вызваться именно он и ни какой другой. Если это не так, то это и есть ответ на вопрос топика.
0
|
||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|||||||
| 29.04.2018, 03:24 | |||||||
return e — это copy-initialization.Только вот в зависимости от типа (и value category) e правила разные.В данном случае, возвращаемый тип у функции — это тип-класс. Поэтому смотрим в
e — тот же (игнорируя cv-квалификаторы) тип-класс, что и инициализируемый (возвращаемый), и e это не prvalue (пункт (17.6.1)), то применяется (17.6.2) и, конечно, explicit-конструктор не подойдёт.Но в случае return HugoCopy(h) действует пункт (17.6.3)Пункт ссылается на [over.match.copy]
Hugo нет.(1.2) даёт нам candidate function HugoCopy::operator Hugo const&.Эта функция, с аргументом HugoCopy(h), используется для инициализации: "The call is used to direct-initialize, according to the rules above, the object that is the destination of the copy-initialization".Это свежий драфт. В драфте n1905 от 2005-го года сказано, в принципе, то же самое:
Добавлено через 22 часа 59 минут Самое забавное, что Croessmah 2.5 года назад цитировал нужное место стандарта и даже подчеркнул:
0
|
|||||||
|
Комп_Оратор)
|
|
| 29.04.2018, 08:42 | |
|
Последнее, скорее всего относится к копи-элизиум оптимизации и к данному случаю не относится. Я не уверен, потому и пишу "скорее всего". В нашем случае (опять же - по идее) имеет место быть возможность прямого указания компилятору - применять копирующий конструктор только для случаев его явного вызова. Это может быть нужно, например, когда операция присаивания и копирующий конструктор работают с ресурсами по разному.
0
|
|
| 29.04.2018, 08:42 | |
|
Помогаю со студенческими работами здесь
20
[C]Почему bind в данном случае выдаёт ошибку Address already in use?
Почему в данном случае ставится двойной нижний пробел __ в цикле for?
Почему не срабатывает конструктор копирования в пользовательском классе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|