2016-01-02 22 views

Odpowiedz

12

Zastanów się, co by się stało, jeśli nie ma tego przeciążenia, i starają się przekazać w const rvalue:

template <typename T> const T &as_const(T &t) { return t; } 
struct S { }; 
const S f() { return S{}; } 
int main() { 
    // auto & ref = as_const(S()); // correctly detected as invalid already 
    auto & ref = as_const(f()); // accepted 
} 

To byłaby przyjęta, ponieważ T byłoby wywnioskować jak const S i uzupełnienia tymczasowe może wiązać się const S &. W wyniku tego przypadkowo uzyskasz odwołanie do lwartej wartości tymczasowej, która zostanie zniszczona zaraz po zainicjowaniu ref. Niemal wszyscy użytkownicy przyjmujący wartości l (zmienne lub parametry funkcji) nie oczekują, że zostaną przekazane tymczasowo; po cichu przyjmowanie tymczasowych oznacza, że ​​łatwo można uzyskać ciche odnośniki.

+0

@dyp Tak, dokładnie, w przeciwnym razie nie byłoby problemu. :) Być może powinienem trochę na to popracować. Dzięki T.C. do edycji, przy okazji, początkowo miałem przykład z xvalue, ale zapomniałem zaktualizować tekst, gdy uprościłem przykład. – hvd

+0

Tak, mój komentarz był bardziej jak wyjaśnienie twojej odpowiedzi. Nie jestem jednak pewien, czy to ograniczenie jest użyteczne; 'as_const (T const &&)' może po prostu zwrócić 'T const &&', a kompilator ostrzega o powiązaniu zmiennej 'T const &' z 'T const &&' w definicji zmiennej nie przedłuża okresu życia. – dyp

+1

@dyp Wtedy może być po prostu 'as_const (T &&)' (no 'const' tam), który zwraca' T const && 'overload. Tak, to byłoby możliwe, ale podejrzewam, że wywołanie 'as_const' i podanie wartości rytuału jest bardziej prawdopodobne, niż błąd, który musi być obsługiwany. – hvd

Powiązane problemy