使用move()代替std::move()有什么缺陷吗?
Are there any pitfalls in using move() instead of std::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);
}
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
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- 当基类是依赖类型时,这是一个缺陷吗
- 返回一个带有 std::move 的对象并链接函数
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 这是 basic.def.odr 部分的缺陷吗?
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- 使用move()代替std::move()有什么缺陷吗?