>백엔드 개발 >C++ >문자열로의 암시적 변환을 통해 개체를 스트리밍하면 오버로드 해결이 실패하는 이유는 무엇입니까?

문자열로의 암시적 변환을 통해 개체를 스트리밍하면 오버로드 해결이 실패하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-05 00:57:01354검색

Why Does Streaming an Object with Implicit Conversion to String Cause Overload Resolution Failure?

문자열로의 암시적 변환을 통해 객체를 스트리밍할 때 오버로드 해결 실패

문제 설명

암시적 문자열로의 변환은 일반적으로 권장되지 않으며, 대신 사용자 정의 유형에 대한 출력 연산자(<<)를 오버로드하는 것이 권장되는 접근 방식입니다. 그러나 암시적 변환 및 객체 스트리밍과 관련된 코드는 오버로드 해결 모호성을 초래할 수 있습니다.

다음 예를 고려하세요.

<code class="cpp">struct NameType {
  operator std::string() { return "wobble"; }
};

struct Person {
  NameType name;
};

int main() {
  std::cout << "bobble";
  std::cout << "wibble";

  Person p;
  std::cout << p.name;
}</code>

오류 메시지

GCC 4.3.4로 이 코드를 컴파일하면 다음 오류가 발생합니다.

prog.cpp: In function ‘int main()’:
prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’

근본 원인

오버로드 세트에 다음 요소의 조합으로 인해 원하는 오버로드가 포함되지 않습니다. 요인:

  • 템플릿 인스턴스화: 원하는 오버로드는 여러 템플릿 매개변수를 사용하여 템플릿 함수를 인스턴스화하는 것입니다.
  • 암시적 변환 금지 : 문자열(NameType::operator std::string)로 암시적으로 변환하면 원하는 오버로드가 고려되지 않습니다.

ADL 제한

인수에 따라 다름 조회(ADL)는 이 문제와 직접적인 관련이 없습니다. ADL은 컴파일러가 함수 호출을 확인할 때 적용되는 컴파일 타임 기능입니다. 이 경우, 함수 호출 없이 컴파일러에 의해 문자열로의 암시적 변환이 수행됩니다.

위 내용은 문자열로의 암시적 변환을 통해 개체를 스트리밍하면 오버로드 해결이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.