임시 반환 객체를 참조에 할당 할 때 공용 복사 생성자가 필요한 이유는 무엇입니까?

채소

다음 코드를 고려하십시오.

class MyClass
{
    MyClass()
    {
        x = 0;
    }
    MyClass(const MyClass&)
    {
        x = 1;
    }
public:
    int x;
    MyClass(MyClass&&)
    {
        x = 2;
    }
    static const MyClass f()
    {
        return MyClass();
    }
};

int main()
{
    const MyClass& p = MyClass::f();
    return 0;
}

이 코드는 VC ++ 2010에서 컴파일되지 않습니다.

error C2248: 'MyClass::MyClass: cannot access private member declared in class 'MyClass'

나는 그것이 RVO와 관련이 있다고 생각하지만 그것이 무엇을하고 있는지 더 잘 이해하고 싶습니다. 복사 생성자를 호출해야 할 이유가 없습니다.

내가 기대하는 것은 다음과 같습니다.

  • f () 입력
  • 기본 생성자 호출
  • 이동 생성자를 호출하여 개체를 반환합니다 (RVO에 의해 최적화되었을 수 있음).
  • 참조 p에 임시 반환 객체 할당

실제로 복사 생성자를 공개하면 정확히 컴파일되고 작동합니다. 복사 생성자는 호출되지 않습니다. x의 최종 값은 0입니다.

요하네스 샤 우브-litb

이것은 C ++ 03 규칙과 관련이 있습니다. C ++ 03에서 처음에 임시를 참조에 할당하면 임시를 복사 할 수 있습니다 .

C ++ 11부터는 해당 동작이 사라지고 더 이상 복사가 수행되지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

"new"키워드를 사용할 때 생성 된 객체가 동일한 객체를 참조하는 이유는 무엇입니까?

분류에서Dev

Clojure에서 시드를 사용할 때 재현 가능한 난수를 반복적으로 생성하지 않는 이유는 무엇입니까?

분류에서Dev

조건부 연산자를 사용할 때 추가 캐스트가 필요한 이유는 무엇입니까?

분류에서Dev

캐시에 객체를 추가하려고 할 때 NullReferenceException이 반환되는 이유는 무엇입니까?

분류에서Dev

할당 연산자를 사용할 때 else 부분의 축약 형 if-else에서 lvalue가 필요한 이유는 무엇입니까?

분류에서Dev

이 할당 연산자가 복사 된 객체를 반환하지 않는 이유는 무엇입니까?

분류에서Dev

참조를 반환 할 때 const를 사용할 수없는 이유는 무엇입니까?

분류에서Dev

사용자 암호를 변경할 때 키를 다시 생성 할 필요가없는 이유는 무엇입니까?

분류에서Dev

const에 대한 정적 참조를 사용하면 임시 변수에 대한 참조가 반환되는 이유는 무엇입니까?

분류에서Dev

Trees / Heaps / Lists 등을 구현할 때`find` 메소드가 obect 자체 대신 객체에 반복자를 반환해야하는 이유는 무엇입니까?

분류에서Dev

typedef 고정 길이 배열에 대한 포인터를 사용하여 memcpy를 수행 할 때 역 참조가 필요합니까? 그 이유는 무엇?

분류에서Dev

컴파일을 시도 할 때 내 C ++ 코드가 생성자 중 하나에 대한 '정의되지 않은 참조'를 계속 반환하는 이유는 무엇입니까?

분류에서Dev

컨트롤러 외부에서 글로벌 vauiable을 사용할 때 select_tag를 사용할 때 객체를 반환하는 이유는 무엇입니까?

분류에서Dev

Vue에서 $ refs를 사용할 때 $ el이 때때로 필요한 이유는 무엇입니까?

분류에서Dev

배열 분해를 사용하지만 객체 분해가 아닌 참조에 값을 할당 할 수있는 이유는 무엇입니까?

분류에서Dev

객체에 대한 참조를 반환 할 수있는 이유는 무엇입니까?

분류에서Dev

Windows mysql 클라이언트에서 명령 프롬프트를 통해 INTO OUTFILE을 사용할 때 슬래시가 필요한 이유는 무엇입니까?

분류에서Dev

'findViewById ()'가 반환 한 'View'객체를 LinearLayout 클래스의 addView ()에 매개 변수로 전달할 때 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

임시 반환 객체가 다른 객체에 즉시 할당되면 복사 생성자가 호출됩니다.

분류에서Dev

공용 상속을 사용할 때만 파생 클래스에 대해 동반자 함수를 "사용할 수있는"이유는 무엇입니까?

분류에서Dev

배열 요소 (복합 할당 연산자를 사용한 후)가 가비지 값을 생성합니다. 이유는 무엇입니까?

분류에서Dev

CrudRepository.save ()가 생성 된 객체를 반환 할 때 FetchType.EAGER를 무시하는 이유는 무엇입니까?

분류에서Dev

C ++ : 스택 할당 객체에 대한 참조가 힙 할당 객체에 대한 참조와 동일하게 취급되는 이유는 무엇입니까?

분류에서Dev

두 개의 다른 공개 키를 사용할 때 pycrypto가 동일한 암호화 결과를 반환하는 이유는 무엇입니까?

분류에서Dev

listIterator가 참조 유형으로 사용될 때 할당 된 객체가이를 구현해야합니까?

분류에서Dev

SSRS 식에서 부울을 반환 할 때 IIF가 필요한 이유는 무엇입니까?

분류에서Dev

사용자가 이동 생성자 또는 이동 할당을 제공 할 때 복사 생성자와 복사 할당이 삭제되는 이유는 무엇입니까?

분류에서Dev

같은 요소에`* ngIf`와`* ngFor`를 사용할 때`* ngFor`가 반복되는 배열에 null 항목을 추가하는 이유는 무엇입니까?

분류에서Dev

다른 객체를 전달할 때 AJAX가 동일한 데이터를 콜백에 반환하는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    "new"키워드를 사용할 때 생성 된 객체가 동일한 객체를 참조하는 이유는 무엇입니까?

  2. 2

    Clojure에서 시드를 사용할 때 재현 가능한 난수를 반복적으로 생성하지 않는 이유는 무엇입니까?

  3. 3

    조건부 연산자를 사용할 때 추가 캐스트가 필요한 이유는 무엇입니까?

  4. 4

    캐시에 객체를 추가하려고 할 때 NullReferenceException이 반환되는 이유는 무엇입니까?

  5. 5

    할당 연산자를 사용할 때 else 부분의 축약 형 if-else에서 lvalue가 필요한 이유는 무엇입니까?

  6. 6

    이 할당 연산자가 복사 된 객체를 반환하지 않는 이유는 무엇입니까?

  7. 7

    참조를 반환 할 때 const를 사용할 수없는 이유는 무엇입니까?

  8. 8

    사용자 암호를 변경할 때 키를 다시 생성 할 필요가없는 이유는 무엇입니까?

  9. 9

    const에 대한 정적 참조를 사용하면 임시 변수에 대한 참조가 반환되는 이유는 무엇입니까?

  10. 10

    Trees / Heaps / Lists 등을 구현할 때`find` 메소드가 obect 자체 대신 객체에 반복자를 반환해야하는 이유는 무엇입니까?

  11. 11

    typedef 고정 길이 배열에 대한 포인터를 사용하여 memcpy를 수행 할 때 역 참조가 필요합니까? 그 이유는 무엇?

  12. 12

    컴파일을 시도 할 때 내 C ++ 코드가 생성자 중 하나에 대한 '정의되지 않은 참조'를 계속 반환하는 이유는 무엇입니까?

  13. 13

    컨트롤러 외부에서 글로벌 vauiable을 사용할 때 select_tag를 사용할 때 객체를 반환하는 이유는 무엇입니까?

  14. 14

    Vue에서 $ refs를 사용할 때 $ el이 때때로 필요한 이유는 무엇입니까?

  15. 15

    배열 분해를 사용하지만 객체 분해가 아닌 참조에 값을 할당 할 수있는 이유는 무엇입니까?

  16. 16

    객체에 대한 참조를 반환 할 수있는 이유는 무엇입니까?

  17. 17

    Windows mysql 클라이언트에서 명령 프롬프트를 통해 INTO OUTFILE을 사용할 때 슬래시가 필요한 이유는 무엇입니까?

  18. 18

    'findViewById ()'가 반환 한 'View'객체를 LinearLayout 클래스의 addView ()에 매개 변수로 전달할 때 오류가 발생하는 이유는 무엇입니까?

  19. 19

    임시 반환 객체가 다른 객체에 즉시 할당되면 복사 생성자가 호출됩니다.

  20. 20

    공용 상속을 사용할 때만 파생 클래스에 대해 동반자 함수를 "사용할 수있는"이유는 무엇입니까?

  21. 21

    배열 요소 (복합 할당 연산자를 사용한 후)가 가비지 값을 생성합니다. 이유는 무엇입니까?

  22. 22

    CrudRepository.save ()가 생성 된 객체를 반환 할 때 FetchType.EAGER를 무시하는 이유는 무엇입니까?

  23. 23

    C ++ : 스택 할당 객체에 대한 참조가 힙 할당 객체에 대한 참조와 동일하게 취급되는 이유는 무엇입니까?

  24. 24

    두 개의 다른 공개 키를 사용할 때 pycrypto가 동일한 암호화 결과를 반환하는 이유는 무엇입니까?

  25. 25

    listIterator가 참조 유형으로 사용될 때 할당 된 객체가이를 구현해야합니까?

  26. 26

    SSRS 식에서 부울을 반환 할 때 IIF가 필요한 이유는 무엇입니까?

  27. 27

    사용자가 이동 생성자 또는 이동 할당을 제공 할 때 복사 생성자와 복사 할당이 삭제되는 이유는 무엇입니까?

  28. 28

    같은 요소에`* ngIf`와`* ngFor`를 사용할 때`* ngFor`가 반복되는 배열에 null 항목을 추가하는 이유는 무엇입니까?

  29. 29

    다른 객체를 전달할 때 AJAX가 동일한 데이터를 콜백에 반환하는 이유는 무엇입니까?

뜨겁다태그

보관