首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用move()而不是std::move()有什么缺陷吗?

使用move()而不是std::move()有什么缺陷吗?
EN

Stack Overflow用户
提问于 2014-05-21 10:57:26
回答 3查看 314关注 0票数 3

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

使用move()还行吗?有什么陷阱吗?使用std::move()更好吗?

示例可编译代码如下:

代码语言:javascript
复制
#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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-21 11:01:27

只有在参数类型也在std中的情况下,ADL才能在std中找到东西。

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

此外,始终拥有std::会使以后阅读代码的人更加容易。它清楚地表明,您已经定义了自己或包含在另一个库中的不是move。如果他们以前没有听说过(相对较新的) std::move,就特别有用。

票数 6
EN

Stack Overflow用户

发布于 2014-05-21 11:08:11

绝对使用std::move!只有在std::命名空间中定义了该类型(由于ADL)时,它才能在不使用ADL的情况下工作。它将不与任何其他类型,如积分类型或使用定义类型。

示例:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2014-05-21 11:03:27

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23781223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档