void foo(int &&r) {
std::cout << r << std::endl;
}
int main() {
int i = 2;
foo(std::move(i));
i = 3; //no warning. any way to get some warnings here?
return 0;
}
Czy nie ma sposobu, aby poinformować kompilator dać mi błąd (lub ostrzeżenie), jeśli przypadkowo użyję zmiennej po jej przeniesieniu? Myślę, że byłoby to bardzo wygodne. Wiele razy znajduję ruchome zmienne gdzie indziej, ale potem muszę być BARDZO DŁUŻĄ, że nie używam ich później. Teraz to nie sprawiło jeszcze żadnych problemów, ale kto wie w dół ... lepiej być bezpiecznym!
Być może istnieją jakieś preprocesorowe oszustwa (lub dość szeroko dostępne rozszerzenia kompilatorów), które istnieją, aby zrobić te rzeczy?
Bardziej realistyczny przykład:
struct HugeStorage {
std::vector<double> m_vec;
HugeStorage(std::vector<double> vec) : m_vec(std::move(vec)) { }
};
struct SmallStorage {
std::vector<double> m_vec;
SmallStorage(std::vector<double> vec) : m_vec(std::move(vec)) { }
};
std::vector<double> vec_from_data_source() {
return std::vector<double>(); //only example!!
}
int main() {
std::vector<double> vec = vec_from_data_source();
if (vec.size() > 10000)
{
HugeStorage storage(std::move(vec));
//do some things, but I gotta be careful I don't do anything to vec
}
else
{
SmallStorage storage(std::move(vec));
//do some things, but I gotta be careful I don't do anything to vec
}
return 0;
}
Zmienna nie została przeniesiona, tylko jej wartość. Nie ma absolutnie nic złego w przypisywaniu jej nowej wartości. –
Jakie "kłopoty" przewidujesz i jaki jest * rzeczywisty * problem z kodem, który wyświetlasz? –
@NikBougalis Aktualizacja bardziej realistyczny przykład – user2015453