Przepraszam, jeśli tytuł pytania jest niedokładny - ale mam trudności ze zrozumieniem, co się tutaj dzieje.L-wartość zaniku do wartości z błędem automatycznym
Rozważmy następujące klasy:
struct foo {
foo(foo&);
};
Poniższy ma żadnych błędów:
void func(foo& f) {
foo bar{f};
}
Jednak kiedy używam Auto:
void func(foo& f) {
auto bar = foo{f};
}
otrzymuję (GCC):
test.cpp: In function ‘void func(foo&)’:
test.cpp:6:21: error: no matching function for call to ‘foo::foo(foo)’
test.cpp:6:21: note: candidate is:
test.cpp:2:5: note: foo::foo(foo&)
test.cpp:2:5: note: no known conversion for argument 1 from ‘foo’ to ‘foo&’
(szczęk)
test.cpp:6:10: error: no matching constructor for initialization of 'bar'
auto bar = foo{f};
^ ~~~~~~
test.cpp:2:5: note: candidate constructor not viable: expects an l-value for 1st argument
foo(foo&);
^
Może ktoś proszę wyjaśnić dlaczego to błąd?
Dzięki!
Edycja: Działa, jeśli dodaję konstruktora kopii do foo. Miałem jednak wrażenie, że deklaracja zmiennej + jawne wywołanie konstruktora po prawej stronie składni "=" jest traktowane specjalnie i nie jest konstrukcją kopiującą, lecz bezpośrednią inicjalizacją.
Czy kompilator wyśle wywołanie konstruktora kopiowania? Miałem wrażenie, że kompilator potraktuje to jako bezpośrednią inicjalizację. –
Ahh pisanie na androidzie jest powolne i wydaje się, że nie ma sposobu, aby usunąć odpowiedź również –
@RobertMason Kompilator może wywołać wywołanie konstruktora kopiowania, który nie ma skutków ubocznych, ale konstruktor kopii musi być nadal możliwy do wywołania. – Oktalist