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>
다음과 같이 문자열 리터럴을 사용하여 Print 메서드를 호출하려고 하면:
<code class="cpp">Output::Print("Hello World");</code>
예기치 않게 출력은 "Hello World" 대신 "True"입니다. ". 왜?
C에서 "Hello World"와 같은 문자열 리터럴은 std::string 유형이 아니라 상수 문자의 배열입니다. 그러나 암시적으로 bool 값으로 변환될 수 있습니다. 표준 변환 시퀀스라고 알려진 이 변환은 std::string에 대한 사용자 정의 변환 생성자보다 컴파일러에서 선호됩니다.
오버로드 해결 중에 컴파일러는 각 인수에 대해 호출할 최상의 함수를 결정합니다. 사용자 정의 변환보다 표준 변환 순서가 선호됩니다. 우리의 경우 "Hello World"에서 bool로의 표준 변환은 std::string으로의 사용자 정의 변환보다 더 나은 것으로 간주됩니다.
std가 ::string 오버로드가 사용되면 std::string 인수를 명시적으로 전달해야 합니다.
<code class="cpp">Output::Print(std::string("Hello World"));</code>
이렇게 하면 모호성이 해결되고 "Hello World"가 올바르게 출력됩니다.
C에서는 암시적 변환과 오버로드 해결에 미치는 영향을 이해하는 것이 중요합니다. 기본적으로 표준 변환은 사용자 정의 변환보다 우선합니다. 따라서 이러한 변환을 인식하고 예기치 않은 동작을 방지하려면 필요한 경우 명시적인 유형 변환을 수행하는 것이 중요합니다.
위 내용은 오버로드된 C 인쇄 방법에서 \'Hello World\'가 \'True\'로 인쇄되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!