조건에 따라 다른 생성자로 C ++ 참조를 초기화하는 방법은 무엇입니까?

Wcochran

foo아래 참조 변수 는의 인스턴스 Foo또는에 Bar기반한 파생 클래스 로 초기화 됩니다 condition. 이상하게도 say()메소드 의 출력을 기반으로 foo할 때 인스턴스가 Foo아닌 인스턴스 인 것 같습니다. Bar왜?

#include <iostream>

class Foo {
public:
    virtual void say() const {
        std::cout << "Foo\n";
    }
};

class Bar : public Foo {
public:
    virtual void say() const {
        std::cout << "Bar\n";
    }
};

int main() {
    constexpr bool condition = false;
    const Foo& foo = condition ? Foo() : Bar();
    foo.say();   // outputs "Foo” ???                                                                                                  
    return 0;
}

각 생성자에 주석을 달면 Bar삼항 표현식을 평가할 때 생성자가 호출되는 것을 볼 수 있습니다 . 각 소멸자에 주석을 달면 소멸자 가 초기화 되기 전에Bar 호출 된다는 것을 알 수 있습니다. 이것은 임시 객체가 삼항 연산자에 의해 생성되었지만 초기화 전에 파괴 되었음을 나타냅니다. 이유는 무엇입니까? fooBar

(Apple LLVM 버전 9.0.0 (clang-900.0.39.2))로 컴파일 됨

clang++ -Wall -std=c++11 foo.cpp -o foo
NathanOliver

문제

const Foo& foo = condition ? Foo() : Bar();

두 부분 모두 동일한 유형을 반환해야한다는 것입니다. 이후 Foo()Bar()동일한 유형 없습니다, 컴파일러는 변환하려고합니다. 그것이 할 수있는 유일한 유효한 변환은 Bar()Foo부분 으로 분할 하는 것 입니다. 이것은 당신이 무엇을 얻든간에 참조를 a에 바인딩 Foo하고 Bar부품이 사라짐을 의미합니다.

이 문제를 해결하려면 다음과 같은 포인터를 사용해야합니다.

#include <iostream>
#include <memory>

class Foo {
public:
    virtual ~Foo() = default;  // don't forget to add this when using polymorphism
    virtual void say() const {
        std::cout << "Foo\n";
    }
};

class Bar : public Foo {
public:
    virtual void say() const {
        std::cout << "Bar\n";
    }
};

int main() {
    constexpr bool condition = false;
    auto foo = condition ? std::make_unique<Foo>() : std::make_unique<Bar>();
    foo->say();   // outputs "Bar" now                                                                                                  
    return 0;
}

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++에서 런타임 조건에 따라 다른 istream 개체를 참조하는 개체를 구성하는 방법은 무엇입니까?

분류에서Dev

C ++ : 조건에 따라 생성자를 선택하는 방법은 무엇입니까?

분류에서Dev

다른 열의 값에 따라 열의 값을 조건부로 바꾸는 방법은 무엇입니까?

분류에서Dev

jbpm의 조건에 따라 프로세스를 다시 시작하는 방법은 무엇입니까?

분류에서Dev

JSON 스키마에 다른 속성이 있는지 여부에 따라 속성을 조건부로 금지하는 방법은 무엇입니까?

분류에서Dev

다른 파일의 조건에 따라 파일에서 행을 선택하는 방법은 무엇입니까?

분류에서Dev

경로에 따라 조건을 만드는 방법은 무엇입니까?

분류에서Dev

조건에 따라 다른 배열 값을 반환하는 방법은 무엇입니까?

분류에서Dev

Pandas : 다른 열 값의 조건에 따라 열을 합산하는 방법은 무엇입니까?

분류에서Dev

다른 파일의 여러 조건에 따라 파일 줄을 선택하는 방법은 무엇입니까?

분류에서Dev

조건에 따라 개체에서 초과 속성을 제거하는 방법은 무엇입니까?

분류에서Dev

조건에 따라 다른 시트에서 셀 값을 얻는 방법은 무엇입니까?

분류에서Dev

참조 수정 자에 따라 딥 또는 얕은 복사를 수행하는 방법은 무엇입니까?

분류에서Dev

GraphQL (NestJS)의 조건에 따라 다른 구독 응답을 보내는 방법은 무엇입니까?

분류에서Dev

다른 필드를 가리키는 필드로 구조를 초기화하는 방법은 무엇입니까?

분류에서Dev

Python 용 SWIG에서 생성시 C 구조체 멤버를 초기화하는 방법은 무엇입니까?

분류에서Dev

C ++ 템플릿 클래스는 유형에 따라 참조로 생성자를 전달합니다.

분류에서Dev

객체가 rvalue 참조인지 여부에 따라 다른 구현으로 라우팅하는 방법은 무엇입니까?

분류에서Dev

일부 열의 조건에 따라 다중 레코드를 선택하는 방법은 무엇입니까?

분류에서Dev

새 열의 조건에 따라 값을 생성하는 방법은 무엇입니까?

분류에서Dev

로그 수준에 따라 다른 파일에 tinylog 로그를 작성하는 방법은 무엇입니까?

분류에서Dev

파이썬의 다른 조건에 따라 동적으로 목록을 만드는 방법은 무엇입니까?

분류에서Dev

특정 조건에 따라 데이터 프레임의 값을 다른 데이터 프레임의 값으로 바꾸는 방법은 무엇입니까?

분류에서Dev

한 방법에서 다른 방법으로 'var'를 참조하는 방법은 무엇입니까?

분류에서Dev

조건에 따라 초기 뷰 컨트롤러를 설정하는 방법은 무엇입니까?

분류에서Dev

조건에 따라 배열에서 숫자의 인덱스 위치를 찾는 방법은 무엇입니까?

분류에서Dev

조건에 따라 wijmo 트리 노드 열기를 비활성화하거나 방지하는 방법은 무엇입니까?

분류에서Dev

Visual C ++ 인라인 어셈블러에서 참조로 가치를 얻는 방법은 무엇입니까?

분류에서Dev

스칼라의 조건에 따라 문자열을 분할하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    C ++에서 런타임 조건에 따라 다른 istream 개체를 참조하는 개체를 구성하는 방법은 무엇입니까?

  2. 2

    C ++ : 조건에 따라 생성자를 선택하는 방법은 무엇입니까?

  3. 3

    다른 열의 값에 따라 열의 값을 조건부로 바꾸는 방법은 무엇입니까?

  4. 4

    jbpm의 조건에 따라 프로세스를 다시 시작하는 방법은 무엇입니까?

  5. 5

    JSON 스키마에 다른 속성이 있는지 여부에 따라 속성을 조건부로 금지하는 방법은 무엇입니까?

  6. 6

    다른 파일의 조건에 따라 파일에서 행을 선택하는 방법은 무엇입니까?

  7. 7

    경로에 따라 조건을 만드는 방법은 무엇입니까?

  8. 8

    조건에 따라 다른 배열 값을 반환하는 방법은 무엇입니까?

  9. 9

    Pandas : 다른 열 값의 조건에 따라 열을 합산하는 방법은 무엇입니까?

  10. 10

    다른 파일의 여러 조건에 따라 파일 줄을 선택하는 방법은 무엇입니까?

  11. 11

    조건에 따라 개체에서 초과 속성을 제거하는 방법은 무엇입니까?

  12. 12

    조건에 따라 다른 시트에서 셀 값을 얻는 방법은 무엇입니까?

  13. 13

    참조 수정 자에 따라 딥 또는 얕은 복사를 수행하는 방법은 무엇입니까?

  14. 14

    GraphQL (NestJS)의 조건에 따라 다른 구독 응답을 보내는 방법은 무엇입니까?

  15. 15

    다른 필드를 가리키는 필드로 구조를 초기화하는 방법은 무엇입니까?

  16. 16

    Python 용 SWIG에서 생성시 C 구조체 멤버를 초기화하는 방법은 무엇입니까?

  17. 17

    C ++ 템플릿 클래스는 유형에 따라 참조로 생성자를 전달합니다.

  18. 18

    객체가 rvalue 참조인지 여부에 따라 다른 구현으로 라우팅하는 방법은 무엇입니까?

  19. 19

    일부 열의 조건에 따라 다중 레코드를 선택하는 방법은 무엇입니까?

  20. 20

    새 열의 조건에 따라 값을 생성하는 방법은 무엇입니까?

  21. 21

    로그 수준에 따라 다른 파일에 tinylog 로그를 작성하는 방법은 무엇입니까?

  22. 22

    파이썬의 다른 조건에 따라 동적으로 목록을 만드는 방법은 무엇입니까?

  23. 23

    특정 조건에 따라 데이터 프레임의 값을 다른 데이터 프레임의 값으로 바꾸는 방법은 무엇입니까?

  24. 24

    한 방법에서 다른 방법으로 'var'를 참조하는 방법은 무엇입니까?

  25. 25

    조건에 따라 초기 뷰 컨트롤러를 설정하는 방법은 무엇입니까?

  26. 26

    조건에 따라 배열에서 숫자의 인덱스 위치를 찾는 방법은 무엇입니까?

  27. 27

    조건에 따라 wijmo 트리 노드 열기를 비활성화하거나 방지하는 방법은 무엇입니까?

  28. 28

    Visual C ++ 인라인 어셈블러에서 참조로 가치를 얻는 방법은 무엇입니까?

  29. 29

    스칼라의 조건에 따라 문자열을 분할하는 방법은 무엇입니까?

뜨겁다태그

보관