Не вызывается конструктор
От: plusovik  
Дата: 04.06.22 10:16
Оценка:
Здравствуйте, попался такой пример.
Проверил и на MSVC, и на g++, пример компилируется, но работает не так, как ожидал.
Дело в том, что не вызывается ни конструктор, ни деструктор.
Скажите, пожалуйста, в чём ошибка?

#include <iostream>

class MyClass {
    static unsigned counter;
public:
    MyClass() {
        ++counter;
        std::cout << "MyClass(), counter = " << counter << std::endl;
    }

    MyClass(const MyClass&) {
        ++counter;
        std::cout << "MyClass( const MyClass& ), counter = " << counter << std::endl;
    }

    ~MyClass() {
        std::cout << "~MyClass()" << std::endl;
    }
};

unsigned MyClass::counter = 0;

int main()
{
    MyClass mc( MyClass() );    // здесь ничего не вызывается

    // MyClass x;               // а здесь всё равботает так, как ожидалось
    // MyClass y( x );          // и здесь работает
    return 0;
}
Re: Не вызывается конструктор
От: Stanislav V. Zudin Россия  
Дата: 04.06.22 10:22
Оценка: +2
Здравствуйте, plusovik, Вы писали:

P>Здравствуйте, попался такой пример.

P>Проверил и на MSVC, и на g++, пример компилируется, но работает не так, как ожидал.
P>Дело в том, что не вызывается ни конструктор, ни деструктор.
P>Скажите, пожалуйста, в чём ошибка?

P> MyClass mc( MyClass() ); // здесь ничего не вызывается


Потому что это не создание переменной, а declaration функции mc. Особенность c++
_____________________
С уважением,
Stanislav V. Zudin
Re: Не вызывается конструктор
От: T4r4sB Россия  
Дата: 04.06.22 10:26
Оценка:
Здравствуйте, plusovik, Вы писали:

P>Здравствуйте, попался такой пример.

P>Проверил и на MSVC, и на g++, пример компилируется, но работает не так, как ожидал.
P>Дело в том, что не вызывается ни конструктор, ни деструктор.
P>Скажите, пожалуйста, в чём ошибка?

А ты варнинги не читаешь, да?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: Не вызывается конструктор
От: plusovik  
Дата: 04.06.22 10:40
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:
P>> MyClass mc( MyClass() ); // здесь ничего не вызывается
SVZ>Потому что это не создание переменной, а declaration функции mc. Особенность c++

Спасибо за ответ, почти разобрался:
компилятор подумал, что mc — это объявление функции, принимающей в качестве аргумента объект MyClass и возвращающей
также объект MyClass.

А скобки у аргумента MyClass() почему не вызвали у компилятора подозрений?
В качестве чего он их воспринял?

Warning-ов ни gcc, ни Visual Studio не выдали
Re[3]: Не вызывается конструктор
От: T4r4sB Россия  
Дата: 04.06.22 10:43
Оценка: -2
Здравствуйте, plusovik, Вы писали:

P>и возвращающей также объект MyClass.


Неверно.
Посмотри ты уже в варнинги наконец

P>Warning-ов ни gcc, ни Visual Studio не выдали


Что за версия gcc?

Только что проверил, гцц и правда молчит. Govno compiler collection оно и есть говно
Clang++ говорит

А так вообще можешь написать mc->foo() и компилятор скажет, что там за тип вывелся
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Отредактировано 04.06.2022 10:49 T4r4sB . Предыдущая версия . Еще …
Отредактировано 04.06.2022 10:47 T4r4sB . Предыдущая версия .
Отредактировано 04.06.2022 10:44 T4r4sB . Предыдущая версия .
Re[4]: Не вызывается конструктор
От: plusovik  
Дата: 04.06.22 12:01
Оценка:
Здравствуйте, T4r4sB, Вы писали:
P>>и возвращающей также объект MyClass.
TB>Неверно.
TB>Посмотри ты уже в варнинги наконец

Ты можешь сказать, что именно неверно? Какой тогда объект возвращает функция?
Warning выдаёт только clang, остальные молчат.
warning: parentheses were disambiguated as a function declaration [-Wvexing-parse]

больше ничего не говорит, версия clang 12
Re[2]: Не вызывается конструктор
От: Pzz Россия https://github.com/alexpevzner
Дата: 04.06.22 12:47
Оценка: -2
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Потому что это не создание переменной, а declaration функции mc. Особенность c++


Что за ужасный язык!
Re[3]: Не вызывается конструктор
От: vopl Россия  
Дата: 04.06.22 12:48
Оценка:
Здравствуйте, plusovik, Вы писали:

P>Здравствуйте, Stanislav V. Zudin, Вы писали:

P>>> MyClass mc( MyClass() ); // здесь ничего не вызывается
SVZ>>Потому что это не создание переменной, а declaration функции mc. Особенность c++

P>Спасибо за ответ, почти разобрался:

P>компилятор подумал, что mc — это объявление функции, принимающей в качестве аргумента объект MyClass и возвращающей
P>также объект MyClass.

P>А скобки у аргумента MyClass() почему не вызвали у компилятора подозрений?

P>В качестве чего он их воспринял?

давай чуть по другомк запишем, думаю станет понятно без дополнительных объяснений
#include <iostream>

class MyClass {
    static unsigned counter;
public:
    MyClass() {
        ++counter;
        std::cout << "MyClass(), counter = " << counter << std::endl;
    }

    MyClass(const MyClass&) {
        ++counter;
        std::cout << "MyClass( const MyClass& ), counter = " << counter << std::endl;
    }

    ~MyClass() {
        std::cout << "~MyClass()" << std::endl;
    }
};

unsigned MyClass::counter = 0;

int main()
{
    MyClass mc( MyClass f() ); // mc это функция, принимающая аргументом функцию f

    MyClass f();
    mc(f);

    // MyClass x;               // а здесь всё равботает так, как ожидалось
    // MyClass y( x );          // и здесь работает
    return 0;
}

MyClass f()
{
    MyClass x;
    return x;
}

MyClass mc( MyClass f() )
{
    MyClass x = f();
    return x;
}
Re[5]: Не вызывается конструктор
От: T4r4sB Россия  
Дата: 04.06.22 12:48
Оценка:
Здравствуйте, plusovik, Вы писали:

P>Ты можешь сказать, что именно неверно? Какой тогда объект возвращает функция?


Путь это будет упражнение на знание плюсов.
Подсказка: напиши mc->foo(), компилятор скажет тип левой части.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: Не вызывается конструктор
От: Bill Baklushi СССР  
Дата: 04.06.22 13:03
Оценка:
Pzz:

Pzz>Что за ужасный язык!

Вы его готовить не умеете.
Re[4]: Не вызывается конструктор
От: plusovik  
Дата: 04.06.22 13:14
Оценка: +1
vopl, спасибо, теперь, кажется, понял
MyClass mc( MyClass() );
// функция mc, принимает в качестве аргумента указатель на другую функцию, которая без аргументов
// и функция mc, и её аргумент возвращают объект MyClass
// а аргумент функции mc без имени, поэтому и показался конструктором
// в конструкторе MyClass(const MyClass&) аргумент также без имени, потому что им не пользовались
Re[4]: Не вызывается конструктор
От: Pzz Россия https://github.com/alexpevzner
Дата: 04.06.22 13:19
Оценка: :))
Здравствуйте, Bill Baklushi, Вы писали:

Pzz>>Что за ужасный язык!

BB>Вы его готовить не умеете.

Бывают вещи, которые надо не правильно готовить, а просто в рот не брать.
Re[3]: Не вызывается конструктор
От: Андрей Тарасевич Беларусь  
Дата: 05.06.22 03:07
Оценка: +3
Здравствуйте, plusovik, Вы писали:

P>Здравствуйте, Stanislav V. Zudin, Вы писали:

P>>> MyClass mc( MyClass() ); // здесь ничего не вызывается
SVZ>>Потому что это не создание переменной, а declaration функции mc. Особенность c++

P>Спасибо за ответ, почти разобрался:

P>компилятор подумал, что mc — это объявление функции, принимающей в качестве аргумента объект MyClass и возвращающей
P>также объект MyClass.

Нет.

Компилятор подумал, что это — это объявление функции `mc`, принимающей в качестве [неименованного] параметра функцию `MyClass (void)` и возвращающую объект типа `MyClass`. Если добавить имя для параметра, то получится

MyClass mc( MyClass fun() );

а так параметр типа "функция" эквивалентен параметру типа "указатель на функцию", то есть ваше объявление фактически эквивалентно

MyClass mc( MyClass (*fun_ptr)() );
Best regards,
Андрей Тарасевич
Re[4]: Не вызывается конструктор
От: plusovik  
Дата: 05.06.22 05:08
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Компилятор подумал, что это — это объявление функции `mc`, принимающей в качестве [неименованного] параметра функцию `MyClass (void)` и возвращающую объект типа `MyClass`. Если добавить имя для параметра, то получится


Спасибо, понял.
А почему компилятор в первую очередь действует так, будто это декларация функции, а не инициализация нового объекта?
По каким словам гуглить и что читать?
Re[5]: Не вызывается конструктор
От: T4r4sB Россия  
Дата: 05.06.22 09:11
Оценка:
Здравствуйте, plusovik, Вы писали:


P>Спасибо, понял.

P>А почему компилятор в первую очередь действует так, будто это декларация функции, а не инициализация нового объекта?
P>По каким словам гуглить и что читать?

https://en.wikipedia.org/wiki/Most_vexing_parse
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[4]: Не вызывается конструктор
От: ути-пути Россия  
Дата: 06.06.22 16:46
Оценка:
Здравствуйте, Bill Baklushi, Вы писали:

Pzz>>Что за ужасный язык!

BB>Вы его готовить не умеете.

Этот момент действительно ужасен, кто об него только не спотыкался.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.