Operator() i Konstruktor bezargumentowy

1

Dana jest klasa Integer z konstruktorem bezargumentowym :

Integer() { }

W tej klasie nie ma zdefiniowanego jawnie operatora() - jest on zdefiniowany niejawnie? Pytam, bo:

const string INTEGER_OBJECT_NAME = typeid(Integer{}).name();
const string INTEGER_OBJECT_NAME_1 = typeid(Integer()).name();
cerr << " typeid(Integer{}).name(); = " << INTEGER_OBJECT_NAME << '\n';
cerr << " typeid(Integer()).name(); = " << INTEGER_OBJECT_NAME_1 << '\n';

W konsoli w strumieniu bledow wynik:
typeid(Integer{}).name(); = N13integer_space7IntegerE
typeid(Integer()).name(); = FN13integer_space7IntegerEvE

na poczatku myslalem ze wynik bedzie identyczny

3

Nazwa FN13integer_space7IntegerEvE wskazuje na funkcje ( pierwsza litera ) , gdyż wyrażenie Integer() jest tutaj traktowane jako bezparametrowa funkcja zwracająca wartość Integer.
Stąd też od C++11 powinno się zawsze używać nawiasów klamrowych.

3

Kod pokazujący prawidłowość odpowiedzi:
https://godbolt.org/z/11ej5We3r

Generalnie problem polega na tym, że typeid jako argument może przyjąć typ, albo wyrażanie.
Teraz Integer() może być zinterpretowane jako typ (funkcja zwracająca wartość typu Integer), albo jako wyrażenie (obiekt tymczasowy typu Integer).
Argument traktowany jako typ ma wyższy priorytet niż wyrażenie (na razie nie znalazłem dokumentacji na to).

1 użytkowników online, w tym zalogowanych: 0, gości: 1