struct X
{
X() { std::cout << "X()\n"; }
X(int) { std::cout << "X(int)\n"; }
};
const int answer = 42;
int main()
{
X(answer);
}
Spodziewałbym się, że to też się wydrukuje
X(int)
, ponieważX(answer);
można to zinterpretować jako odlew zint
doX
lub- w ogóle nic, ponieważ
X(answer);
mogłoby być zinterpretowane jako deklaracja zmiennej.
Jednak drukujeX()
i nie mam pojęcia, dlaczego X(answer);
miałbym wywołać domyślny konstruktor.
PUNKTY DODATKOWE: Co musiałbym zmienić, aby uzyskać tymczasową zamiast zmiennej deklarację?
c++
syntax
most-vexing-parse
fredoverflow
źródło
źródło
X(int(answer));
nic nie drukuje, bo to deklaracja funkcji :)double(expresso);
you go, zadeklarowany specjalnie dla Ciebie;)Odpowiedzi:
Twoja odpowiedź jest tutaj ukryta. Jeśli deklarujesz zmienną, wywołujesz jej domyślny ctor (jeśli nie jest to POD i tak dalej).
Przy zmianie: aby uzyskać tymczasowy, masz kilka opcji:
(X(answer));
(X)answer;
static_cast<X>(answer)
X{answer};
(C ++ 11)[]{ return X(answer); }();
(C ++ 11, może spowodować skopiowanie)void(), X(answer);
X((void(),answer));
true ? X(answer) : X();
if(X(answer), false){}
for(;X(answer), false;);
X(+answer);
źródło
static_cast<X>(answer)
że odpowiedź jest „najbardziej C ++” - jest nawet zalecana przez starą dokumentację GCC jako sposób na wymuszenie wartości r.X(answer)
i gwarantuje wezwanie lekarza.X{answer}
.Nawiasy są opcjonalne. To, co powiedziałeś, jest identyczne
X answer;
i jest to oświadczenie deklaracji.źródło
Jeśli chcesz zadeklarować zmienną typu X, powinieneś to zrobić w ten sposób:
X y(answer);
źródło
X(int)
lekarza.