2014-05-21 3 views
1

새로운 C++ 11의 std::move()을 사용할 때, ADL 덕택에 std:: 네임 스페이스 접두사없이 move()이라고 쓸 수 있음에 유의했습니다.std :: move() 대신 move()를 사용하는데있어서 함정이 있습니까?

move()을 사용하고 계십니까? 함정이 있습니까? std::move()을 사용하는 것이 더 낫습니까?


샘플 컴파일 가능한 코드는 다음과 같습니다 인수 유형 std도 경우

#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

반대로 "'이동()'표준 : : 이동()''청소기보다 본다". 또한'move()'가'std :: move()'보다 더 많은 일을 할 필요가 있고 ADL에 의해 발견 될 필요가 있다면,'move()'는 깨진다. – Griwes

답변

6

ADL은 std에서 일을 찾을 수 있습니다.

move이라는 다른 기호가 사용되고있는 다른 네임 스페이스에있는 경우 컴파일러는 사용자가 의도 한 것을 알 수 없습니다. 지금은 없지만 향후 변경으로 인해 1 인치가 생길 수 있습니다.

또한 항상 std::을 사용하면 나중에 코드를 읽는 사람들이 훨씬 쉽게 이용할 수 있습니다. 자신이 정의했거나 다른 라이브러리에서 포함 된 것이 move이 아님을 분명히합니다. 이전에 (상대적으로 새로운) std::move에 대해 들어 본 적이없는 경우 특히 유용합니다.

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 
+1

int로 이동하면 이해가되지 않습니다 ... –

+2

@ Mr.C64 : 템플리트 유형으로'벡터'또는'int'를 사용할 수있는 템플리트에서 move를 사용해야 할 때까지 기다립니다. 그 외에도 동일한 인수가 사용자 정의 유형에 적용됩니다. – Danvil

관련 문제