このmove'ed:は、エラー、または少なくとも警告を取得::他の場所
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;
}
変数は移動されておらず、値は移動していません。新しい値を割り当てることに間違いはありません。 –
あなたは何の「トラブル」を予見していますか、あなたが見せているコードの*実際の問題は何ですか? –
@NikBougalisより現実的な例で更新されました – user2015453