我是否可以将已移动的变量标记为不再可用,如果使用它,会收到编译器警告?

问题描述 投票:3回答:2

有时在函数中,我使用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();
}
c++ move-semantics
2个回答
1
投票

部分答案:可以将clang-tidybugprone-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));
^

0
投票

A,没有。您唯一的办法是使用作用域块,尽管并非总是如此,但在这种特殊情况下可以这样做。

我想知道语法是否

v = delete;

可以被C ++采用;我不认为这是一个重大变化,并且与删除类成员函数的语法相匹配。显然,它没有运行时效果。为什么不提出呢?

© www.soinside.com 2019 - 2024. All rights reserved.