2017-05-17 3 views
2

나는 다음과 같은 코드가 있습니다암시 적 캐스트에서 bool하는

bool 

은 내가 출력으로 예상 한 것 : :이 출력을 얻을 때 실행

#include <iostream> 
#include <string> 

void foo(bool a) 
{ 
     std::cout << "bool" << std::endl; 
} 

void foo(long long int a) 
{ 
     std::cout << "long long int" << std::endl; 
} 

void foo(const std::string& a) 
{ 
     std::cout << "string" << std::endl; 
} 

int main(int argc, char* args[]) 
{ 
     foo("1"); 
     return 0; 
} 

string 

g ++ 4.9가 왜이 문자열을 암시 적으로 bool로 변환합니까?

답변

3

컴파일러가 표준을 올바르게 해석하고 있습니다. 네, 이것은 많은 면접자들이 묻는 까다로운 코너 케이스로, 실제보다 더 똑똑해 보입니다. 이 독점적으로 내장 사용하기 때문에 유형

bool-const char*에 경로 const char[2] (리터럴 "1"의 형식 유형)하는 표준 변환 순서입니다.

귀하의 컴파일러 해야에 찬성하는 즉 사용자 정의 변환 순서에. std::string 생성자를 생성한다.

과부하가 존재하면 void foo(long long int a)은 붉은 청어입니다.

할 수 있습니다 bool에 과부하를 삭제하고 그 자리에

#include <type_traits> 
template < 
    typename Y, 
    typename T = std::enable_if_t<std::is_same<Y, bool>{}> 
> 
void foo(Y) 
{ 
    std::cout << "bool" << std::endl; 
} 

를 작성하여 C++ (11)이 주위에 오히려 우아하게 작동합니다. 그런 다음 컴파일러는 템플릿을 통해 const char[N]에 대해 std::string을 선호합니다 (이는 과부하 해결 요구 사항 중 하나이므로). 좋은!

0

"1"은 포인터로 변환 된 후 bool으로 변환되는 char의 배열 인 문자열 리터럴입니다. 이 경로는 임시 std::string 개체의 암시 적 구성보다 우선적으로 사용됩니다.

0

"1"은 문자열 인수로, 함수 인수로 사용하면 const char* 유형의 포인터로 감소합니다. 기능 foo에 대한 과부하가 const char*인데도 const char*에서 bool으로의 표준 변환이 있으므로 foo(bool)으로 되돌아갑니다. 포인터 값은 bool 인수로 취해지면 somePtr==nullptr ? false : true과 같이 해석됩니다.