Аватар для oobarbazanoo
7 / 30 / 9
Регистрация: 13.05.2015
Сообщений: 1,835

Почему в данном случае срабатывает неявный конструктор

15.02.2018, 01:20. Показов 2548. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему в данном случае срабатывает неявный конструктор, хотя он и помечен explicit?

Main.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "Hugo.h"
 
Hugo f();
 
Hugo f() {
    Hugo h;
    return HugoCopy(h);
}
 
int main(void) {
 
    return 0;
}
Hugo.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Hugo {
public:
    Hugo() {  }  
    explicit Hugo(Hugo const&) {  }
};
 
struct HugoCopy { 
    HugoCopy(Hugo const& hugo) 
      :hugo(hugo)
    { }
    operator Hugo const&() { return hugo; }
 
private:
    Hugo const& hugo;
};
Добавлено через 23 секунды
Взял отсюда: https://stackoverflow.com/ques... 03#4285803.

Добавлено через 8 минут
После дебага заметил что тут выходит почему-то одновременно с вызовом конструктора:
C++
1
2
3
HugoCopy(Hugo const& hugo) 
      :hugo(hugo)
    { }
Сразу после происходит вызов оператора:

C++
1
 operator Hugo const&() { return hugo; }
Кто знает, подскажите, пожалуйста, почему.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2018, 01:20
Ответы с готовыми решениями:

Как правильно вызвать конструктор вектора в данном случае?
#include <iostream> #include <fstream> #include <map> #include <vector> #include <string> using namespace std; typedef...

Почему нужен   в данном случае?
Привет всем!Собственно такой вопрос:Почему в данном случае нужен   ? И у меня при написании дескриптора <wbr>строка...

Почему типы-параметры нельзя вывести в данном случае?
static class S { public static T2 Select<T, T2>(T source, Func<T, T2> f) => new T2; public static void P() => Select(new...

20
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
29.04.2018, 15:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
Последнее, скорее всего относится к копи-элизиум оптимизации и к данному случаю не относится.
Тем не менее.

Цитата Сообщение от IGPIGP Посмотреть сообщение
В нашем случае (опять же - по идее) имеет место быть возможность прямого указания компилятору - применять копирующий конструктор только для случаев его явного вызова. Это может быть нужно, например, когда операция присаивания и копирующий конструктор работают с ресурсами по разному.
Ничего не понял.

Цитата Сообщение от oobarbazanoo Посмотреть сообщение
Почему в данном случае срабатывает неявный конструктор, хотя он и помечен explicit?
Кстати, зашёл сейчас на stackoverflow и, оказывается, я тут зря распинался. Там же всё объяснено в ответе:
Цитата Сообщение от https://stackoverflow.com/questions/4285608/is-there-a-explicit-copy/4285803#4285803
This relies on a subtle corner of the C++ language. So if you use this, you better know what you're doing or you don't do it: It first calls the conversion function on HugoCopy (or in the first case, the constructor of Hugo) to get a Hugo / Hugo const&, and then it direct initializes the destination Hugo object with that Hugo object. GCC doesn't like the code, but Clang and Comeau/EDG accept it according to the above semantics.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2018, 15:25

[C]Почему bind в данном случае выдаёт ошибку Address already in use?
Пытаюсь разобраться с темой сокетов. Есть клиент и сервер,которые связываются через STREAM сокет. Принцип такой: Сервер ожидает входящих...

Почему в данном коде не срабатывает присвоение
Всем привет, подскажите пожалуйста почему в данном коде не срабатывает присвоение shouldStartChecks=true и на экран всегда...

Почему в данном случае ставится двойной нижний пробел __ в цикле for?
>>> def fib(n): a = 0 b = 1 for __ in range(n): a = b + b return a >>>

Почему в данном случае работа с заранее выделенной памятью медленнее чем с динамической?
Написал функцию которая на основе списка выделяет память и при каждом вызове возвращает указатель на следующий элемент для объекта. Код...

Почему не срабатывает конструктор копирования в пользовательском классе
вроде со всем разобралась, но не заходит в конструктор копирования. В чём ошибка? #include <iostream> #include...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru