code

추론되지 않은 컨텍스트는 무엇입니까?

codestyles 2020. 12. 25. 09:53
반응형

추론되지 않은 컨텍스트는 무엇입니까?


나는 최근 에이 질문노출되었고 대답은 "추론되지 않은 맥락"으로 요약 될 수 있습니다.

특히, 첫 번째는 그것이 그런 것이라고 말한 다음 "세부 사항"에 대한 표준으로 리디렉션하는 반면, 두 번째는 표준을 인용합니다.

누군가 나처럼 단순한 필사자에게 추론 되지 않은 맥락무엇인지 , 언제 발생하며 왜 발생하는지 설명해 주시겠습니까?


추론 은 주어진 인수에서 템플릿 매개 변수의 유형을 결정하는 프로세스를 나타냅니다. 기능 템플릿, auto및 기타 몇 가지 경우 (예 : 부분 전문화)에 적용됩니다. 예를 들어 다음을 고려하십시오.

template <typename T> void f(std::vector<T>);

이제 말한다면 f(x)당신이 선언 된 경우, std::vector<int> x;다음 T되는 추론 으로 int, 당신은 전문화를 얻을 f<int>.

추론이 작동하려면 추론 할 템플릿 매개 변수 유형이 추론 가능한 컨텍스트에 나타나야합니다. 이 예에서의 함수 매개 변수 f는 그러한 추론 가능한 컨텍스트입니다. 즉, 함수 호출 표현식의 인수를 사용 T하면 호출 표현식이 유효하기 위해 템플릿 매개 변수 무엇인지 결정할 수 있습니다.

그러나 추론이 불가능한 추론 되지 않은 컨텍스트 있습니다. 표준 예는 "의 왼쪽에 나타나는 템플릿 매개 변수입니다 ::.

template <typename> struct Foo;

template <typename T> void g(typename Foo<T>::type);

이 함수 템플릿 T에서 함수 매개 변수 목록의는 추론되지 않은 컨텍스트에 있습니다. 따라서 당신은 말하고 g(x)추론 할 수 없습니다 T. 그 이유는 임의의 유형과 멤버 간에 "역방향 대응"이 없기 때문입니다 Foo<T>::type. 예를 들어 다음과 같은 전문 분야를 가질 수 있습니다.

 template <> struct Foo<int>       { using type = double; };
 template <> struct Foo<char>      { using type = double; };
 template <> struct Foo<float>     { using type = bool; };
 template <> struct Foo<long>      { int type = 10; };
 template <> struct Foo<unsigned>  { };

당신이 호출 할 경우 g(double{})두 가지 가능한 답이있다 T, 당신이 호출하면 g(int{})아무 대답이 없다. 일반적으로 클래스 템플릿 매개 변수와 클래스 멤버 간에는 관계가 없으므로 합리적인 인수 추론을 수행 할 수 없습니다.


때때로 명시 적으로 논증 추론을 금지하는 것이 유용합니다. 예를 들어 std::forward. 당신의 전환이있을 때 또 다른 예입니다 Foo<U>Foo<T>말, 또는 다른 변환을 (생각 std::string하고 char const *). 이제 무료 기능이 있다고 가정합니다.

template <typename T> bool binary_function(Foo<T> lhs, Foo<T> rhs);

을 호출 binary_function(t, u)하면 공제가 모호하여 실패 할 수 있습니다. 그러나 한 가지 주장 만 추론하고 다른 주장은 추론 하지 않는 것이 합리적 이므로 암시 적 변환을 허용합니다. 이제 다음과 같이 명시 적으로 추론되지 않은 컨텍스트가 필요합니다.

template <typename T>
struct type_identity {
    using type = T;
};

template <typename T>
bool binary_function(Foo<T> lhs, typename type_identity<Foo<T>>::type rhs)
{
    return binary_function(lhs, rhs);
}

(같은 공제 문제를 경험했을 수 있습니다 std::min(1U, 2L).)

참조 URL : https://stackoverflow.com/questions/25245453/what-is-a-nondeduced-context

반응형