编译时间陷阱以使用“移动”对象

时间:2018-03-18 14:01:01

标签: c++ c++11

您应该小心明确地移动对象。核心指南建议避免无意义地使用显式移动。见ES.56

  

当源是rvalue(例如,返回处理中的值或函数结果)时,隐式地进行移动,因此在这些情况下通过显式写入move不会使代码复杂化。相反,编写返回值的短函数,函数的返回和调用者对返回的接受都将自然优化。

但有时你有一个很大的功能,需要在那里使用std::move。我提出了一个技巧,这可能会有所帮助:

#include <utility>

struct Moved;
#define MOVED(x) void x(Moved)

struct X {
    int x{5};
};

int foo(X x) {
    auto tmp = std::move(x);
    MOVED(x);
    return x.x;
}

int main() {
    return foo(X());
}

这个想法是,在移动后我引入了不同类型的同名符号。不需要参数Moved,但错误消息看起来更有用:

  

[x86-64 gcc 7.2#1]错误:请求'x'中的成员'x',这是非类型'void(已移动)'

这是一种悲观情绪,还是在实践中有所帮助。你怎么看?

0 个答案:

没有答案