これ:
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;
}
変数を移動した後に誤って変数を使用した場合、コンパイラにエラー (または警告) を与えるように指示する方法はありませんか? これはとても便利だと思います。多くの場合、変数をそのように別の場所に移動していることに気付きますが、後で使用しないように手動で非常に注意する必要があります。これでまだ問題は発生していませんが、今後のことは誰にもわかりません...安全に気をつけてください!
たぶん、このようなことを行うために存在するプリプロセッサのトリック(またはかなり広く利用可能なコンパイラ拡張機能)がいくつかありますか?
より現実的な例:
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;
}