在使用新的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);
}发布于 2014-05-21 11:01:27
只有在参数类型也在std中的情况下,ADL才能在std中找到东西。
如果正在使用的另一个名称空间中有另一个名为move的符号,那么编译器将不知道您的意思是什么。现在可能没有,但未来的变化可能带来一个。
此外,始终拥有std::会使以后阅读代码的人更加容易。它清楚地表明,您已经定义了自己或包含在另一个库中的不是move。如果他们以前没有听说过(相对较新的) std::move,就特别有用。
发布于 2014-05-21 11:08:11
绝对使用std::move!只有在std::命名空间中定义了该类型(由于ADL)时,它才能在不使用ADL的情况下工作。它将不与任何其他类型,如积分类型或使用定义类型。
示例:
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发布于 2014-05-21 11:03:27
它是在实用程序中定义的相同的移动函数。http://en.cppreference.com/w/cpp/utility/move,但如果代码清晰,您可以编写std::move
https://stackoverflow.com/questions/23781223
复制相似问题