【问题标题】:Passing the const-qualified object to the 'std::move'将 const 限定对象传递给“std::move”
【发布时间】:2022-01-21 08:13:22
【问题描述】:

通过在 PVS-Studio 中进行一些代码分析,它给了我一些警告信息。

我在头文件中有如下语句:

constexpr int MIN_ALLOWED_Y { 0 };

在源文件中:

std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) )

在上面的表达式中,我使用std::moveMIN_ALLOWED_Y 转换为xvalue,因为我认为std::make_pair 只接受右值;

// from https://en.cppreference.com/w/cpp/utility/pair/make_pair

template< class T1, class T2 >
constexpr std::pair<V1,V2> make_pair( T1&& t, T2&& u );

但我收到如下警告消息:

V833 Passing the const-qualified object 'MIN_ALLOWED_Y' to the 'std::move' function disables move semantics.

这是一个有效的警告吗?如果是这样,那我该怎么办?我应该删除std::move(在这种情况下可能是多余的吗?)?

一个更好的问题是在哪里不使用std::move

【问题讨论】:

  • 所以你的代码在某处有std::move(MIN_ALLOWED_Y)?为什么会这样做,是不是因为一些通用模板代码不知道 MIN_ALLOWED_Y 是一个简单的整数?
  • @John Zwinck 是的。我将其添加到问题中。

标签: c++ move-semantics static-code-analysis pvs-studio


【解决方案1】:

您的代码:

std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) )

过于复杂。正如 PVS Studio 告诉您的那样,moves 不仅毫无意义,而且在显式指定类型时使用 make_pair 也是毫无意义的。您可以简化为:

std::pair<const int, const int>( MIN_ALLOWED_Y, MAX_ALLOWED_Y )

没有多余的仪式就可以做同样的事情。

【讨论】:

  • 我想知道这两个consts 是否还需要。或者类型应该是const std::pair&lt;int, int&gt;。我想这对 OP 来说更像是一个问题。
  • 我对@9​​87654327@ 的行为感到困惑。 MIN_ALLOWED_Y 不是左值吗? make_pair的右值引用参数如何绑定到左值?
  • @digito_evo 在您看到的make_pair 的原型中,&amp;&amp; 是“转发引用”,而不是右值引用。
  • 不,您不必使用右值,而且无论如何您都不会从 make_pair 中受益,因为您正在传递显式模板类型参数。
  • 是的,编译器非常聪明,可以针对同一事物进行优化。事实上,make_pair 不那么直接,因此您可能想知道直接使用 pair 是否会更快……但如果您在构建时启用了优化,它们将是相同的。
【解决方案2】:

听起来您在某处写了std::move(MIN_ALLOWED_Y),并从静态分析器收到了警告。是的,我会删除 std::move,因为将常量移动到其他地方没有任何意义。

移动语义用于在 C++ 对象周围移动,在这些对象中复制对象中包含的数据/资源可能是不可能或代价高昂的。移动操作中作为数据源的对象可能会被移动改变,但你的常量不可能改变。

【讨论】:

    猜你喜欢
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多