Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
6 / 29 / 9
Регистрация: 13.05.2015
Сообщений: 1,835
1

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

15.02.2018, 01:20. Просмотров 974. Ответов 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/questions/...285803#4285803.

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

C++
1
 operator Hugo const&() { return hugo; }
Кто знает, подскажите, пожалуйста, почему.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2018, 01:20
Ответы с готовыми решениями:

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

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

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

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

20
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
29.04.2018, 15:25 21
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2018, 15:25

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.