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