使用move()而不是std :: move()有任何陷阱吗?

时间:2014-05-21 10:57:26

标签: c++ c++11 move

使用新的C ++ 11 std::move()时,我注意到,由于ADL,可以只编写move(),而不需要std::名称空间前缀。

使用move()就好吗?有任何陷阱吗?使用std::move()只是更好吗?


示例可编辑代码如下:

#include <iostream>
#include <utility>
#include <vector>

template <typename T>
void print(const char* const descr, const std::vector<T>& v) {
    std::cout << descr << ": ";
    for (const auto& x : v) {
        std::cout << x << ' ';
    }
    std::cout << std::endl;    
}

int main() {
    std::vector<int> v{11, 22, 33};
    std::vector<int> w = move(v);

    print("v", v);
    print("w", w);
}

3 个答案:

答案 0 :(得分:6)

如果参数类型也在std中,ADL只会在std中查找内容。

如果在另一个名称空间中有另一个名为move的符号,那么编译器就不会知道你的意思。现在可能没有,但未来的变化可能会带来一个。

此外,始终拥有std::会让人们以后更轻松地阅读您的代码。它清楚地表明,它不是您自己定义的move或其他库中包含的std::move。如果他们之前没有听说过(相对较新的){{1}},那就特别有用了。

答案 1 :(得分:4)

绝对使用std::move!如果类型在std::命名空间中定义(由于ADL),它将在没有std 的情况下工作。它可以与任何其他类型一起使用,例如整数类型或使用已定义的类型。


示例:

std::vector<int> v = {1,2,3};
std::vector<int> w = move(w); // will work due to ADL
int i1 = 4;
int i2 = move(i1); // ERROR
struct Foo {};
Foo x{};
Foo y = move(x); // ERROR

答案 2 :(得分:0)

它与实用程序中定义的移动函数相同。 http://en.cppreference.com/w/cpp/utility/move 但是对于是的代码清晰度,您可以编写std :: move