2013-03-11 2 views
5

을 가지고 내가 최근에 다음과 같은오버로드 생성자 - 부울 인수 constructur이 우선

class Foo { 
public: 
    Foo(std::string msg) {} 
private: 
    Foo(bool b) {} 
}; 

같은 클래스 우연히 나는

Foo foo("blah"); 

원인에 의해이 클래스의 객체를 만들려고 것으로 나타났습니다 Foo::Foo(bool)이 비공개임을 나타내는 컴파일 오류. 명백히 인수가 실제 std :: string이 아닌 경우 컴파일러는 bool 인수와 함께 생성자를 사용합니다. 반면에 private 생성자가 주어지지 않는다면, 위의 코드는 잘 컴파일됩니다.

"bool -constructor"가 "string -constructor"보다 우선하는 이유는 무엇입니까? 전달 된 인수의 유형이 그 중 어떤 유형에도 맞지 않는 이유는 무엇입니까? 이것은 정의의 문제일까요? 아니면 더 깊은 의미와 좋은 이유가 있습니까?

+0

확실하지 * 관련 우선 검사의 깊이 설명에 훨씬 더를 가지고 비슷한 질문 왜 *하지만, 그들은 (아마도) 둘 다'명백해야한다 '. –

+0

실제로, 명시 적 키워드는 동작을 변경하지 않습니다. – symphonic

+0

이 경우에는 그렇지 않습니다. –

답변

7

이유는 변환 연산자 우선 순위와 관련이 있습니다. 호출의 각각은 암시 적 변환을

  1. 포인터를 포함 ->std::string
  2. 포인터 -이 경우, 1 번>bool

하는 사용자 정의 변환 및 # 2 것은 정의 언어/컴파일러 하나. 사용자 정의 변환은 우선 순위가 훨씬 낮으므로 다른 변환이 우선적입니다. 여기에 편집

는 약

conversion precedence in c++

+0

사양 어딘가에? – Nick

+2

@nick 부록 B.2에서 보자. – JaredPar

+1

표준을 의미하는 speck라면 네, ** §13.3.3.2,2 **에 있습니다 : 암시 적 변환 시퀀스의 기본 형태를 비교할 때 [...] - 표준 변환 시퀀스 [...]는 사용자 정의 변환보다 나은 변환 시퀀스입니다. 시퀀스 * ('const char * -> bool'는 표준 변환 시퀀스입니다) –