std::string 대신 문자열 리터럴 일치 부울 오버로드
다음 C 코드를 고려하세요.
<code class="cpp">class Output { public: static void Print(bool value) { std::cout << (value ? "True" : "False"); } static void Print(std::string value) { std::cout << value; } };</code>
다음과 같이 메소드를 호출할 때:
<code class="cpp">Output::Print("Hello World");</code>
출력을 보면 놀랄 수도 있습니다.
True
왜 표준 대신 Print 메소드의 부울 오버로드가 호출되었는지: :stringoverload?
변환 메커니즘 이해
"Hello World"와 같은 C의 문자열 리터럴은 const 문자 배열로 저장됩니다. 그러나 암시적으로 const 문자에 대한 포인터로 변환된 후 bool로 변환될 수 있습니다.
제공된 코드에서 컴파일러는 사용자- "Hello World"에서 std::string으로의 변환 순서를 정의했습니다. 이 기본 설정은 표준 변환 순서가 사용자 정의 변환 순서보다 우선한다는 C 표준을 기반으로 합니다.
문제 해결
표준 변환 순서를 보장하려면 ::string 오버로드가 호출되면 std::string 인수를 명시적으로 전달합니다.
<code class="cpp">Output::Print(std::string("Hello World"));</code>
이렇게 하면 컴파일러가 std::string 오버로드를 사용하도록 강제하여 "Hello World"를 올바르게 출력합니다. .
위 내용은 내 C 코드가 \'Hello World\' 대신 \'True\'를 인쇄하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!