Według this prefiksu std::atomic<T>::operator++
zwraca T
, więc ten kod zwiększa tylko v
raz:Czy std :: atomic :: operator ++ naprawdę zwraca wartość?
template<class T> void addTwo(std::atomic<T>& v) {
++(++v);
}
Również std::atomic<T>::operator=
apparently Zwraca T
, więc ten kod dereferences nieprawidłowy wskaźnik, który używany aby wskazać tymczasowe T
:
template<class T>
void setOneThenTwo(std::atomic<T>& v) {
auto ptr = &(v = 1);
*ptr = 2;
}
Ja na pewno nie sugeruję, że te wzorce kodowe są dobrą praktyką, jednak jest to bardzo zaskakujące o mnie, że je łamie. Zawsze oczekuję, że operator=
i prefiks operator++
zwrócą referencję do *this
.
Pytanie: Czy cppreference prawo o rodzajach tu wrócić, a jeśli tak, to czy istnieje dobry powód konieczności std::atomic
zachowują się inaczej niż wbudowanych typów w tym zakresie?
Jeśli 'operator =' zwraca 'T', to' i (v = 1) 'nie powinno się nawet kompilować, prawda? –
@ R.MartinhoFernandes: Ponieważ jest to tymczasowa rura? –
Czy zwraca wartość l? Jeśli nie, to drugie ++ nie skompiluje się, więc przynajmniej uratujesz się od błędnego zachowania, jeśli spodziewałeś się, że to się rozwinie. – CashCow