有时在我使用的函数中std::move
传递我不再使用的变量,如下所示:
void f(std::vector<int> v)
{
for (int i: v)
{
std::cout << i << ", ";
}
}
void main()
{
std::vector<int> v(1000);
std::fill(v.begin(), v.end(), 42);
f(std::move(v));
}
我了解 std::move 使我的向量处于有效状态,所以我可以调用v.clear()
如果我想的话,可以重复使用它。但在一个长函数中,我稍后可能会向其中添加更多代码,但却忘记了我的移动函数丢失了数据,从而引入了错误。
我可以在移动之后放置某种编译器指令来警告我不要重用此变量吗?像这样:
void main()
{
std::vector<int> v(1000);
std::fill(v.begin(), v.end(), 42);
f(std::move(v));
#pragma mark_unusable(v);
// This should trigger a compiler warning
v[5] = 10;
}
部分答案:您可以使用clang-tidy
以其移动后使用容易出错 https://clang.llvm.org/extra/clang-tidy/checks/bugprone-use-after-move.html查看。这不抓到v.clear()
在你的例子中,但至少在其他情况下是这样。例子:
clang-tidy -checks=bugprone-use-after-move your-file.cpp
当你添加第二个时f(std::move(v));
第一次调用后,这会给你
your-file.cpp:15:17: warning: 'v' used after it was moved [bugprone-use-after-move]
f(std::move(v));
^
your-file.cpp:14:5: note: move occurred here
f(std::move(v));
^
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)