给定模板函数,不直接使用模板参数进行输入.C++类型推断如何工作?例如给定
template<typename T>
void f(T::value_type){}
Run Code Online (Sandbox Code Playgroud)
何时(如果有的话)将为此函数键入推理工作?
除了template<typename T1,...>void f(T1,T2,...)可能发生类型推断的地方之外还有其他地方吗?
一如既往,引用额外信贷的标准.
它永远不适用于嵌套类型,除非T也是一个参数.
如果调用f(1),编译器无法找到所有的T与嵌套的机会typedef int value_type;.
您可以推断出属于参数类型的类型,例如
template<class T>
void f(std::vector<T>);
Run Code Online (Sandbox Code Playgroud)
我想这是你的答案:
14.8.2.4 - 从类型[temp.deduct.type]中推导出模板参数
[...]
-3- [...]
在大多数情况下,用于撰写的类型,模板和非类型值
P参与模板参数推导.也就是说,它们可用于确定模板参数的值,并且如此确定的值必须与其他地方确定的值一致.但是,在某些上下文中,该值不参与类型推导,而是使用模板参数的值,这些参数可以在别处推导或明确指定.如果模板参数仅在非弱化上下文中使用且未明确指定,则模板参数推断将失败.-4-非受限的上下文是:
使用qualified-id 指定的类型的嵌套名称说明符.
一种类型,它是一个template-id,其中一个或多个template-arguments是一个引用模板参数的表达式.
如果以包含非损坏上下文的方式指定类型名称,则包含该类型名称的所有类型也都是非限定的.但是,复合类型可以包括推导类型和非推导类型.[ 实施例:如果一个类型被指定为
A<T>::B<T2>,两者T和T2是nondeduced.同样地,如果一个类型被指定为A<I+J>::X<T>,I,J,和T是nondeduced.如果将类型指定为void f(A<T>::B, A<T>),则TinA<T>::B为nondeuced但TinA<T>推导出.]
您T::value_type是类型的限定ID,因此其嵌套名称说明符中的类型是非限定的,必须明确指定.
编辑:此信息来自ISO/IEC 14882:1998.