암시 적 변환이 템플릿 함수 매개 변수에 적용되지 않는 이유는 무엇입니까?

제이슨 c

다음 예제 (C ++ 17)로 범위를 좁힌 일부 템플릿 항목에 문제가 있습니다.

template <typename T> struct item {
  operator item<const T> () const { return item<const T>(); }
};

void conversionToConstRefWorks (const item<const int> &) { }

template <typename T> 
void butNotWhenTemplated (const item<const T> &) { }

int main () {

  item<int> i;
  item<const int> ci;

  // these all compile fine:
  conversionToConstRefWorks(ci);
  conversionToConstRefWorks(i);
  butNotWhenTemplated(ci);

  // but this one fails:
  butNotWhenTemplated(i); 

}

그 예에서 :

  • item<T>에 대한 암시 적 변환 연산자가 item<const T>있으며
  • 변환은에서 작동하는 것 conversionToConstRefWorks()같지만
  • 변환은에서 누락 된 것 같습니다 butNotWhenTemplated(). 여기서는 item<const int>잘 전달 될 수 있지만 전달은 item<int>컴파일에 실패합니다.

해당 예제의 컴파일은 다음과 함께 실패합니다 (GCC 9.3).

g++ --std=c++17 -W -Wall -pedantic -Wno-unused-variable    const_interop.cpp   -o const_interop
const_interop.cpp: In function ‘int main()’:
const_interop.cpp:54:24: error: no matching function for call to ‘butNotWhenTemplated(item<int>&)’
   54 |   butNotWhenTemplated(i);
      |                        ^
const_interop.cpp:40:6: note: candidate: ‘template<class T> void butNotWhenTemplated(const item<const T>&)’
   40 | void butNotWhenTemplated (const item<const T> &) {
      |      ^~~~~~~~~~~~~~~~~~~
const_interop.cpp:40:6: note:   template argument deduction/substitution failed:
const_interop.cpp:54:24: note:   types ‘const T’ and ‘int’ have incompatible cv-qualifiers
   54 |   butNotWhenTemplated(i);
      |                        ^

루트 오류는 다음과 같습니다.

'const T'및 'int'유형에 호환되지 않는 cv 한정자가 있습니다.

나는 그것이 문자 그대로 의미하는 바를 이해하지만 그것이 왜 일어나고 있는지 이해하지 못합니다. 내 기대는 것입니다 item<int> :: operator item<const int> () const호출 할 때 변환 연산자를 적용 할 것이다 butNotWhenTemplated(i)호출 할 때이 적용된 것처럼 conversionToConstRefWorks(i), 그리고이 int선택 될 것이다 T.

내 주요 질문은 : 왜 이것이 컴파일되지 않습니까?

내 다른 질문은이 게시물의 범위를 벗어난 이유로 butNotWhenTemplated템플릿이어야하고 <const T>모든 item매개 변수 를 지정해야 하며 호출 할 때 템플릿 매개 변수를 명시 적으로 지정할 수 없다는 것입니다. 이러한 제약 조건으로이 작업을 수행 할 수있는 방법이 있습니까?

여기에 ideone (GCC 8.3)이 있습니다.

YSC
item<int> i;
template <typename T> void butNotWhenTemplated (const item<const T> &) { }
butNotWhenTemplated(i); 

에 따르면 템플릿 인수 대체 규칙, 더는 T찾을 수 없습니다 item<const T>일치하는 item<int>. 변환 (내장 또는 사용자 정의)을 고려하기 전에 하드 오류 방식으로 실패합니다.

유형 추론은 암시 적 변환 (위에 나열된 유형 조정 제외)을 고려하지 않습니다. 이것이 나중에 발생하는 과부하 해결 작업입니다. 그러나 템플릿 인수 추론에 참여하는 모든 매개 변수에 대해 추론이 성공하고 추론되지 않은 모든 템플릿 인수가 명시 적으로 지정되거나 기본값이 지정되면 나머지 함수 매개 변수가 해당 함수 인수와 비교됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

함수 템플릿 인수 추론에서 암시 적 변환을 강제하는 방법이 있습니까?

분류에서Dev

템플릿 함수 매개 변수가 해결되었지만 템플릿 반환 유형이 아닌 이유는 무엇입니까?

분류에서Dev

템플릿 유형 인수를 암시 적으로 캐스팅 할 수없는 이유는 무엇입니까?

분류에서Dev

템플릿 템플릿 매개 변수를 사용하여 std :: vector <MyType>을이 함수에 전달할 수없는 이유는 무엇입니까?

분류에서Dev

함수 매개 변수에 유형을 적용하고 암시 적 변환을 피하는 방법은 무엇입니까?

분류에서Dev

매개 변수가 sam 템플릿에 적용되지 않습니다.

분류에서Dev

Twirl 템플릿 기본 매개 변수 값이 적용되지 않음

분류에서Dev

이 정수 암시 적 변환이 모호한 이유는 무엇입니까?

분류에서Dev

shared_ptr이 함수에서 반환 될 때 암시 적으로 부울로 변환되지 않는 이유는 무엇입니까?

분류에서Dev

함수 내에서 사용되지 않는 매개 변수 앞에 밑줄이있는 매개 변수의 목적은 무엇입니까?

분류에서Dev

C ++의 가변 템플릿에서 함수 매개 변수에 유형 제한을 적용하는 좋은 방법이 있습니까?

분류에서Dev

템플릿이 템플릿 매개 변수보다 '오버로드'되지 않는 이유는 무엇입니까?

분류에서Dev

명시적인 템플릿 인수를 사용하여 템플릿 친구 함수를 호출 할 수없는 이유는 무엇입니까?

분류에서Dev

가변 템플릿 매개 변수와 함께 struct를 사용하면 두 개의 템플릿 인스턴스가 동시에 생성되는 이유는 무엇입니까?

분류에서Dev

암시 적으로 함수 매개 변수를 지정하는 방법은 무엇입니까?

분류에서Dev

println에 대해 함수 매개 변수로 적용이 실패하고 인쇄되지 않는 이유는 무엇입니까?

분류에서Dev

보기 범위는 더 이상 사용되지 않습니다. 대신 암시 적 매개 변수 사용

분류에서Dev

템플릿 매개 변수 팩이 마지막이어야하는 이유는 무엇입니까?

분류에서Dev

유형이 아닌 템플릿 매개 변수로 double이 허용되지 않는 이유는 무엇입니까?

분류에서Dev

템플릿 매개 변수에 대한 정적 어설 션이 호출되지 않았습니다.

분류에서Dev

템플릿 매개 변수에 대한 공제가 반환 유형으로 만 사용되는 이유는 무엇입니까?

분류에서Dev

템플릿 매개 변수 수가 다른 클래스 / 구조체 선언이 허용되지 않는 이유는 무엇입니까?

분류에서Dev

TypeError : 기호를 정수로 암시 적으로 변환하지 않는 이유는 무엇입니까?

분류에서Dev

std :: bind에서 템플릿 함수 매개 변수를 사용하는 방법은 무엇입니까?

분류에서Dev

함수에서 템플릿 별칭을 매개 변수로 사용하고 자동으로 추론 할 수없는 이유는 무엇입니까?

분류에서Dev

템플릿 인수 대체가 실패하고 암시 적 변환이 수행되지 않음

분류에서Dev

이름이 지정되지 않은 비 유형 템플릿 매개 변수의 요점은 무엇입니까?

분류에서Dev

템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

분류에서Dev

Singleton CRTP를 사용하는 템플릿 매개 변수 유형의 인라인 정적 멤버에 대해 올바른 컴파일러는 무엇입니까?

Related 관련 기사

  1. 1

    함수 템플릿 인수 추론에서 암시 적 변환을 강제하는 방법이 있습니까?

  2. 2

    템플릿 함수 매개 변수가 해결되었지만 템플릿 반환 유형이 아닌 이유는 무엇입니까?

  3. 3

    템플릿 유형 인수를 암시 적으로 캐스팅 할 수없는 이유는 무엇입니까?

  4. 4

    템플릿 템플릿 매개 변수를 사용하여 std :: vector <MyType>을이 함수에 전달할 수없는 이유는 무엇입니까?

  5. 5

    함수 매개 변수에 유형을 적용하고 암시 적 변환을 피하는 방법은 무엇입니까?

  6. 6

    매개 변수가 sam 템플릿에 적용되지 않습니다.

  7. 7

    Twirl 템플릿 기본 매개 변수 값이 적용되지 않음

  8. 8

    이 정수 암시 적 변환이 모호한 이유는 무엇입니까?

  9. 9

    shared_ptr이 함수에서 반환 될 때 암시 적으로 부울로 변환되지 않는 이유는 무엇입니까?

  10. 10

    함수 내에서 사용되지 않는 매개 변수 앞에 밑줄이있는 매개 변수의 목적은 무엇입니까?

  11. 11

    C ++의 가변 템플릿에서 함수 매개 변수에 유형 제한을 적용하는 좋은 방법이 있습니까?

  12. 12

    템플릿이 템플릿 매개 변수보다 '오버로드'되지 않는 이유는 무엇입니까?

  13. 13

    명시적인 템플릿 인수를 사용하여 템플릿 친구 함수를 호출 할 수없는 이유는 무엇입니까?

  14. 14

    가변 템플릿 매개 변수와 함께 struct를 사용하면 두 개의 템플릿 인스턴스가 동시에 생성되는 이유는 무엇입니까?

  15. 15

    암시 적으로 함수 매개 변수를 지정하는 방법은 무엇입니까?

  16. 16

    println에 대해 함수 매개 변수로 적용이 실패하고 인쇄되지 않는 이유는 무엇입니까?

  17. 17

    보기 범위는 더 이상 사용되지 않습니다. 대신 암시 적 매개 변수 사용

  18. 18

    템플릿 매개 변수 팩이 마지막이어야하는 이유는 무엇입니까?

  19. 19

    유형이 아닌 템플릿 매개 변수로 double이 허용되지 않는 이유는 무엇입니까?

  20. 20

    템플릿 매개 변수에 대한 정적 어설 션이 호출되지 않았습니다.

  21. 21

    템플릿 매개 변수에 대한 공제가 반환 유형으로 만 사용되는 이유는 무엇입니까?

  22. 22

    템플릿 매개 변수 수가 다른 클래스 / 구조체 선언이 허용되지 않는 이유는 무엇입니까?

  23. 23

    TypeError : 기호를 정수로 암시 적으로 변환하지 않는 이유는 무엇입니까?

  24. 24

    std :: bind에서 템플릿 함수 매개 변수를 사용하는 방법은 무엇입니까?

  25. 25

    함수에서 템플릿 별칭을 매개 변수로 사용하고 자동으로 추론 할 수없는 이유는 무엇입니까?

  26. 26

    템플릿 인수 대체가 실패하고 암시 적 변환이 수행되지 않음

  27. 27

    이름이 지정되지 않은 비 유형 템플릿 매개 변수의 요점은 무엇입니까?

  28. 28

    템플릿 매개 변수를 사용하지 않는 템플릿 클래스의 메서드에 대한 컴파일러 최적화가 있습니까?

  29. 29

    Singleton CRTP를 사용하는 템플릿 매개 변수 유형의 인라인 정적 멤버에 대해 올바른 컴파일러는 무엇입니까?

뜨겁다태그

보관