this SO question에 응답 할 때 표준 형식 (이미 C++ 03, 여전히 C++ 11)에서 비 형식형 템플릿 인수로만 주소를 사용할 수 있음을 발견했습니다. 양식 & id-expression
(일부 예외 포함).포인터가 아닌 형식의 템플릿 인수
하지만 대답 할 수 없었습니다. 이유는입니다.
:
14.3.2 템플릿이 아닌 형태 인수 [temp.arg.nontype]
비 유형에 대한 템플릿 인수 비 템플릿 템플릿 파라미터 중 하나 여야한다 [...]
정적 저장소> 지속 시간 및 외부 또는 내부 연결 이있는 개체의 주소를 지정하는 상수 식 (5.19) 또는 외부 또는 내부 연결이있는 함수 (함수 템플릿 및 함수 템플릿 포함) -ids하지만 exc 비정규 클래스 멤버를 사용하는 경우, &은 이름이 함수 또는 배열을 참조하는 경우 생략 될 수 있으며 해당 템플릿 매개 변수가 참조 인 경우 생략해야한다는 점을 제외하고는 & ID 표현으로 표현됩니다 (괄호 무시). [...]
은
(n3485 강조 광산)
예 :
using TFoobar = int (*)();
template < TFoobar tp > struct foo_struct{};
int foobar() { return 42; }
constexpr TFoobar pFoobar = &foobar;
foo_struct < &foobar > o0; // fine
foo_struct <pFoobar> o1; // ill-formed
나는 그것이 번역 상 함께 할 수있는 뭔가가 생각, 즉 컴파일러는 많이 알고하지 않습니다 주소에 대해서. 그러나, 왜 그것이 허용되지 않습니까? 컴파일러가 pFoobar
을 &foobar
으로 바꾸기 위해 매크로 대체와 비슷한 것을 사용할 수 없어야합니까?
아주 좋은 질문입니다. –
나는 그것이 보수적 인 변화를 만드는 문제라고 생각한다.C++ 11은 컴파일러 구현자를 위해 일을 쉽게하기 위해 언어가하는 엄격한 방법으로 가득 차 있습니다. C++ 11을 위와 같이 확장 할 수도 있지만 C++ 14 이상에서는 문제가됩니다! – Yakk
이러한 제한 사항을 제거하기위한 제안 [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4268.html]이 있습니다. – dyp