2010-11-30 7 views
3

귀하의 의견으로 어떤 생성자가 호출됩니까?생성자 : 바로 호출되는 것입니까?

class Element { 
public: 
    Element(bool b = true, bool c = true); 
    Element(const std::string s, bool b = true, bool c = true); 
}; 
... 
Element element("something", true); 

틀린! 첫번째.

처음부터 Stroustrup의 책을 다시 시작해야합니까?

const없이 시도했지만 아무 것도 변경되지 않았습니다.

char *는 std :: string보다 bool처럼 보입니다. 이 코드의 모든 것을

모든 권리 :

Element element(string("something"), true); 

컴파일러 : 마이크로 소프트 비주얼 C++

2010 OS : 윈도우 7

+0

편집에 대한 질문에 답변하신 것 같습니다. 여기에 다른 질문이 있습니까? –

+1

side note :'std :: string's를 값으로 전달하지 마십시오; const 참조는 아마도 여기에서 더 효율적입니다. – tenfour

+0

tenfour : 예, const 참조는 내가 처음에 사용한 것입니다. 상황이 개선되었는지 확인하기 위해 참조를 제거하려고했습니다. – Pietro

답변

7

가 내장 bool에 포인터 타입의 변환, null이 아닌 포인터는 true으로 변환되고 null 포인터 값은 false으로 변환됩니다.

std::string

은 선호되지 않는다 (워드 사용자의 느슨한 의미에서) 사용자 정의 형식이므로 std::string- const char*에서 변환되는 기본 const char* bool 전환. 이런 식으로해야합니다 (또는 const char * 걸리는 과부하를 추가하십시오).

Element element(std::string("something"), true); 
+0

첫 번째 매개 변수를 문자열 참조로 변경해도 차이가 있습니까? – Klaim

+0

@Klaim : 아니요. 값으로 전달하거나 임시로 'const' 참조 매개 변수에 바인딩하는 경우에도'const char *'에서'std : string'으로 변환해야합니다. –

+0

예, const char *을 사용하는 오버로드를 추가하고 모든 것이 잘 작동합니다. 감사. – Pietro

2

. C++ 표준 (N1905)를 말한다

,

는 $ 4.1 표준 변환이 정의 암시 변환되어 내장 유형. 4 절은 이러한 변환의 전체 집합 을 열거합니다. 일체형 프로모션 부동 소수점 추진 - 제로 또는 집합 다음 하나 전환

[...]

: 표준 변환 시퀀스는 다음 위해 표준 전환 서열이다 통합 변환, 부동 소수점 변환, 부동 통합 변환, 포인터 변환, 회원 변환에 포인터, 및 부울 전환 수.

[...] 일반적

$ 4.4 암시 변환 시퀀스 (13.3.3.1) 표준 변환의 다른 다음 사용자 정의 변환 하였다 시퀀스 이루어져 표준 변환 순서.

4.회원 종류 12 부울 전환

$ 4.12.1 산술 열거 r- 수치의

, 포인터 또는 포인터 형 BOOL의 r- 수치로 변환 할 수있다. 0 값, null 포인터 값 또는 null 멤버 포인터 값이 false로 변환됩니다. 다른 값은 true로 변환됩니다..

13.3.3.2 순위 암시 적 변환 시퀀스

2 기본 (13.3.3.1에 정의 등) 암시 적 변환 시퀀스의 형태

비교 - 표준 변환 시퀀스 (13.3.3.1.1)은 사용자 정의 변환 시퀀스 또는 ell보다 우수한 변환 시퀀스 입니다. IPSI가 전환 서열 및

- 사용자 정의 변환 시퀀스 (13.3.3.1.2)는 생략 변환 시퀀스 (13.3.3.1.3)보다 더 나은 변환 시퀀스이다.

희망 사항은 코드에 표시된 동작을 잘 설명합니다.

Implicit conversion sequences (C++ only)

: :-)

또한, 이것은 좋은 읽기입니다.

+1

사용자 정의 변환 순서보다 부울 변환이 선택된 이유를 설명하려면 13.3.3.2 [over.ics.rank]를 인용해야합니다. –

+0

@ Charles Bailey ..... 완료. 조언 해주셔서 감사합니다! – Nawaz

+0

@Charles & @Nawaz : 답장을 보내 주셔서 감사합니다. 나는 그것이 더 "실용적"이기 때문에 찰스를 받아 들였습니다. 그러나 나는 Nawaz의 드러난 이론적 측면에 감사드립니다. – Pietro

관련 문제