2017-12-17 24 views
4

cppreference.com에 따르면, move 왜 그것의 arugment로를 rvalue 참조를 T&& t 걸립니까 서명을std :: move가 rvalue 참조를 인수로 사용하는 이유는 무엇입니까?

template< class T > 
typename std::remove_reference<T>::type&& move(T&& t) noexcept; 

이있다?

또한 다음 코드 나 컴파일러에서 오류가있어

void foo(int&& bar) { 
    cout << "baz" << endl; 
} 

int main(){ 
    int a; 
    foo(a); 
} 

무슨 일

의 "를 rvalue 참조를 좌변에 바인딩 할 수 없습니다"를 시도 할 때? 난 너무 혼란 스러워요.

+1

'T && t'는 rvalue 참조라고 가정했습니다. 이것은시기 상조입니다.'T && t'가''T''가 무엇인지 알기 전까지는''rvlaue reference ''인지 아닌지를 말할 방법이 없습니다. 'T'가 추론 될 때 외부 조건에 따라'T && t'가 rvalue와 lvalue reference 사이를 전환하도록 언어 규칙 (형식 공제와 참조 축소)이 의도적으로 만들어집니다. – AnT

+1

혼란 스럽습니다. 더블 앰프 &&는 문맥에 따라 두 가지 의미 중 하나를가집니다. 템플릿 매개 변수에서 "전달 참조"를 나타냅니다. –

답변

8

이 값은 rvalue reference가 아니라 forwarding reference입니다. 이는 인수의 가치 범주를 보존 할 수있다. 즉, std::move은 lvalue와 rvalue를 모두 취하여 무조건 rvalue로 변환 할 수 있음을 의미합니다.

전달 참조는 함수 인수의 값 범주를 보존하는 특별한 종류의 참조이며 std :: forward를 사용하여 전달할 수 있습니다. 전달 참조 중입니다

1) 동일한 함수 서식 CV-비정규 형 템플릿 파라미터 r- 수치 기준으로 선언 된 기능 템플릿 함수 파라미터 : & & A로부터 추론 된 경우를 제외

2) 자동 중괄호로 묶인 초기화 목록.

한편, int&&은 rvalue reference이다. 템플릿 템플릿 매개 변수가 TT&& 유형, 즉 추론 유형 T 인 경우 매개 변수는 전달 참조입니다.

+0

내가 배우기 엔 너무. 정말 고마워 –