>

다음 두 가지 과부하를 고려하십시오 :

template <T> void foo(T * d);
template <T> void foo(const T & d);

이렇게 사용하면 :

foo<double>(0);

어떤 과부하가 호출됩니까? 이 동작을 정의하는 사양 단락을 알려 주시겠습니까?

ps : 몇 가지 빠른 테스트에서 리터럴 0이 nullptr과 일치하는 것 같으므로 포인터 과부하가 선택되었지만 언어 사양에서 알고 싶습니다.

(edit) 실제 참조 인 const 참조를 추가했습니다.


  • 답변 # 1

    http://en.cppreference.com/w/cpp/language/overload_resolution에서

    가장 유용한 기능:

    와이즈 비즈

    그리고암시 적 변환 시퀀스 순위

    와이즈 비즈

    그래서

    1) there is at least one argument of F1 whose implicit conversion is better than the corresponding implicit conversion for that argument of F2
    2) or. if not that, (only in context of non-class initialization by conversion), the standard conversion sequence from the return type of F1 to the type being initialized is better than the standard conversion sequence from the return type of F2
    3) or, if not that, F1 is a non-template function while F2 is a template specialization
    4) or, if not that, F1 and F2 are both template specializations and F1 is more specialized according to the partial ordering rules for template specializations

    템플릿 포함

    Each type of standard conversion sequence is assigned one of three ranks:

    1) Exact match: no conversion required, lvalue-to-rvalue conversion, qualification conversion, function pointer conversion, (since C++17) user-defined conversion of class type to the same class
    2) Promotion: integral promotion, floating-point promotion
    3) Conversion: integral conversion, floating-point conversion, floating-integral conversion, pointer conversion, pointer-to-member conversion, boolean conversion, user-defined conversion of a derived class to its base

    # 1은 # 2보다 전문화되어 있습니다.

    f(double*); // null pointer conversion f(const double&); // Floating–integral conversions f(0); // Ambiguous call

  • 이전 reactjs - nextJS에서 조건부 구성 요소를 ssr하는 방법은 무엇입니까?
  • 다음 c++ - cpp에서 명령 실행