有时在函数中,我使用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()
并重用它。但是在长函数中,我可能稍后会向其中添加更多代码,而忘记了我的move函数丢失了数据,并引入了错误。
移动后是否可以放置某种编译器指令以警告我不要重用此变量?像这样:
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.clear();
}
部分答案:可以将clang-tidy
与bugprone-use-after-move检查一起使用。在您的示例中,这不会捕获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)); ^
A,没有。您唯一的办法是使用作用域块,尽管并非总是如此,但在这种特殊情况下可以这样做。
我想知道语法是否
v = delete;
可以被C ++采用;我不认为这是一个重大变化,并且与删除类成员函数的语法相匹配。显然,它没有运行时效果。为什么不提出呢?