2017-11-25 7 views
0

여기에 사용할 용어가 무엇인지 확실하지 않아 정보를 찾기가 어려워졌습니다. 이 후 내 코드 (히트 컴파일, 몇 곳을 업데이트하는 것을 잊어 버린 것을 깨달았습니다. 어쨌든 컴파일되고 오류없이 실행되었습니다.)을 통해 간단한 예제를 통해 확인했습니다.포함 된 유형의 매개 변수 구성

다른 클래스를 포함하는 컨테이너 클래스가 있습니다. 클래스에 포함 된 const 참조를 사용하는 생성자가 있습니다. 컨테이너 클래스에 대한 const 참조를 사용하는 또 다른 함수가 있습니다. 포함 된 클래스의 인스턴스에 함수를 전달할 수 있으며 자동으로 컨테이너 클래스의 임시 인스턴스를 자동으로 생성합니다. 경고가 없습니다 (-Wall -pedantic -Wextra -Werror).

#include <iostream> 

class A { // Contained class. 
public: 
    A(int i) : a_number_(i) {} 
    void print() const { std::cout << a_number_ << "\n"; } 
private: 
    int a_number_; 
}; 

class A_Container { // Container class. 
public: 
    ~A_Container() { delete a_; } 
    A_Container(const A& a) : a_(new A(a)) { std::cout << "I was called!\n"; } 
    const A& getA() const { return *a_; } 
private: 
    A* a_; 
}; 

void foo(const A_Container& container) { // This func takes a container... 
    container.getA().print(); 
} 

int main() { 
    A a(147); 
    foo(a); // ...but I'm passing it the contained class. 
    return 0; 
} 

출력 :이 무엇을

I was called! 
147 

라고? 이러한 유형의 변환에 필요한 요구 사항은 무엇입니까?

의 의미는이 작동한다는 것을 알 수 있지만 컴파일러 마술보다 더 많은 부분이 있습니까?

편집 :

유용한 링크 : 그것은 단일 인자 생성자 explicit을 표시하지가있는 경우 암시 적으로 당신을 위해 컨테이너 클래스를 구성합니다 ++ What does the explicit keyword mean?

답변

2

C. 실수로 이런 일을 방지하기 위해, 명시 적으로 단항 생성자를 한정하는 것이 일반적이다 :

지금
explicit Container(const A& a); 

그것이 사실 인 경우 코드 "작업"실수 방지하기 위해, 어떤 경우에는 개선되는 (컴파일되지 않습니다 잘못되거나 바람직하지 않음).