1

복사 기본 생성자가 아닌 기본 형식 변수에서 복사 생성자를 복사하고 rvalue 참조 함수 인수를 전달할 수 있습니다.rvalue 참조 함수 인수를 통해 전달할 때 기본 유형 변수에서 복사하는 방법

그러나 원시 타입 변수로 어떻게 할 수 있습니까? 예를 들어

: 비주얼 스튜디오 2013 년

#include <cassert> 
#include <iostream> 
struct MyClass 
{ 
    int m = 0; 
}; 
MyClass& f(MyClass& x) 
{ 
    x.m++; 
    return x; 
} 
inline MyClass f(MyClass&& x) 
{ 
    return f(x); 
} 
int& f(int& x) 
{ 
    x++; 
    return x; 
} 
inline int f(int&& x) 
{ 
    return f(x); 
} 
int main() 
{ 
    MyClass x1; 
    auto y1 = f(MyClass(x1)); // Calls f(MyClass&&) 
    // Result: x1.m = 0, y1.m = 1 

    int x2 = 0; 
    auto y2 = f(int(x2)); // Calls f(int&) 
    // Result: x2 = 1, y2 = 1 

    std::cout << x1.m << x2; // Result in VS2013: '01' But '00' in gcc and clang! 
    assert(x1.m == x2); // FAILED in VS2013!!! 
    return 0; 
} 

결과는 선언이 실패한와 '01'입니다.

http://rextester.com/CAPY87169

+0

VS2013이 없지만 이렇게하면 어떻게됩니까? y2 = f (int x3 = x2); ? –

+0

@IanThompson 오류 C2144 : 구문 오류 : 'int'앞에 ')'가 표시됩니다. –

답변

3

코드는 정확하고이 VS2013에서 버그가 수 있도록 보인다.

간단한 MCVE :

#include <iostream> 

void f(int& x) { std::cout << "f(lv)\n"; } 
void f(int&& x) { std::cout << "f(rv)\n"; } 

int main() 
{ 
    int x2 = 0; 
    f(int(x2)); 
    f((int)x2); 
} 

출력은이어야한다 : 상기 테스트는 버그 (int)x2가 MSVC 의해 좌변으로 처리되어 실제로 보이는지

f(rv) 
f(rv) 

MSVC online tester

참고; MSVC의 확장 기능으로 인해 rvalues가 lvalue 참조에 바인딩되는 버그가 아닙니다 (rvalue 참조가 더 나은 일치이기 때문에).

/Za 스위치를 사용하여 문제를 해결할 수도 있습니다.

간단한 형태 지정자 :


발현 int(x2)는 C++ 14 expr.type.conv/2 (C++ (11)가 가진 동일한 번호)에 의해 덮여 (7.1.6.2) 또는 typename-specifier (14.6) 다음에 괄호로 둘러싸인 표현식 목록은 표현식 목록이 주어지면 지정된 유형의 값을 생성합니다. 표현식 목록이 단일 표현식이면 형식 변환 표현식은 해당 캐스트 표현식 (5.4)과 동일합니다 (정의가되어 있고 의미가 정의 된 경우).

대응 캐스트 식이다 :

식 (T) 캐스트 식 T는 좌변 참조 형 또는 r- 수치 참조 경우, 결과는 좌변 인 입력 T.하다 결과 T가 객체 유형에 대한 rvalue 참조 인 경우 함수 유형 및 xvalue로; 그렇지 않은 경우 결과는입니다.

+1

https://connect.microsoft.com/VisualStudio/Feedback/Details/615622 –

관련 문제