使用move()代替std::move()有什么缺陷吗?

Are there any pitfalls in using move() instead of std::move()?

本文关键字:move 缺陷 什么 std 代替 使用      更新时间:2023-10-16

当使用新的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);
}

ADL只会在std中找到参数类型也在std中的东西。

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

另外,总是有std::会让人们更容易阅读你的代码。它清楚地表明,它不是您自己定义或从其他库包含的move。如果他们以前没有听说过(相对较新的)std::move,则特别有用。

一定要用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

与在utility中定义的move函数相同。http://en.cppreference.com/w/cpp/utility/move但是为了代码清晰,你可以写std::move