>source

기본 템플릿 매개변수가 오른쪽에서 시작하지 않는 방식으로 "기본값"을 사용할 수 있습니까?

기준은 무엇입니까?
컴파일러는 어떻게 해석합니까?

예를 들어 이 code가 작동한다는 사실에 너무 놀랐습니다.

#include <iostream>using namespace std;
template <bool T=true, class U>   //"default" from LEFT-most parameter
void f(U u){
    if(T){ cout<<true;}
    else cout<<false;
}
int main() {
    auto x= []( ){  };
    f(x);
    return 0;
}

실시간 데모 보기: https://ideone.com/l6d9du

  • 답변 # 1

    템플릿 인수 추론은 여기에서 잘 작동합니다. 왜냐하면 함수 템플릿의 경우 후속 템플릿 인수가 함수 인수에 의해 추론될 수 있기 때문입니다. 이 경우 템플릿 인수함수 인수에서 추론할 수 있습니다.. 클래스 템플릿의 경우 예상대로 기본 템플릿 인수 이후의 템플릿 매개변수는 기본 템플릿 인수를 갖거나 템플릿 매개변수 팩이어야 합니다.

    §14.1/11 템플릿 매개변수 [temp.param]:

    <블록 인용>

    템플릿 매개변수가 클래스 템플릿, 변수 템플릿 또는 별칭 템플릿에는 기본 템플릿 인수가 있으며 각각의 후속 템플릿 매개변수에는 기본 템플릿 인수가 있어야 합니다. 제공되거나 템플릿 매개변수 팩이어야 합니다. 템플릿 매개변수의 경우 기본 클래스 템플릿, 기본 변수 템플릿 또는 별칭 템플릿 템플릿 매개변수 팩이며 마지막 템플릿 매개변수가 됩니다. 기능 템플릿의 템플릿 매개변수 팩은 따라갈 수 없습니다. 템플릿 매개변수가 함수의 매개변수 유형 목록([dcl.fct])에서 추론 템플릿 또는 기본 인수([temp.deduct])가 있습니다. 템플릿 공제 가이드 템플릿([temp.deduct.guide])의 매개변수는 기본 인수가 없습니다. 추론 가이드 템플릿의 매개변수 유형 목록입니다. [ 예시:

    template<class T1= int, class T2> class B;   //error
    //U can be neither deduced from the parameter-type-list nor specified
    template<class... T, class... U> void f() { } //error
    template<class... T, class U> void g() { }    //error
    

    — 끝 예 ]

    당신은추론할 수 없고 무슨 일이 일어날지 보십시오:

    template <bool T=true, class U>   //"default" from LEFT-most parameter
    void f(){
        if(T){ cout<<true;}
        else cout<<false;
    }
    int main() {
        f();            //Fail. Can't deduce U.
        f<true>();      //Fail. Can't deduce U.
        f<true, int>(); //Fine. T=true, U=int.
        return 0;
    }
    

    code가 작동하도록 하려면 모든 템플릿 인수를 명시적으로 지정해야 하므로 기본 템플릿 인수가 전혀 의미가 없습니다. 만들고 싶다면NS()또는f< 참>()일, 당신은 줄 필요가기본 템플릿 인수도 포함합니다(또는 템플릿 매개변수 팩으로 설정).

    template <bool T=true, class U=int>void f(){
        if(T){ cout<<true;}
        else cout<<false;
    }
    int main() {
        f();              //Fine. T=true,  U=int
        f<false>();       //Fine. T=false, U=int
        f<false, char>(); //Fine. T=false, U=char
        return 0;
    }
    

  • 답변 # 2

    모든 매개변수에 대해 기본값을 제공할 수 있습니다.

    기본값을 사용하려면 기본 매개변수 오른쪽에 매개변수를 명시적으로 지정할 수 없습니다. 그러나 귀하의 예에서함수에 대한 인수의 유형에서 추론되고 있으며,NS기본값으로 설정되어 있습니다.

  • 이전 javascript : ChartJS의 평균 2개 키
  • 다음 c# : 변수가 있을 수 있을 때 입력을 결정하는 방법은 무엇입니까?