在模板化函数中输入`T :: some_typredef`的推断

Ela*_*ich 3 c++ templates

给定模板函数,不直接使用模板参数进行输入.C++类型推断如何工作?例如给定

template<typename T>
void f(T::value_type){}
Run Code Online (Sandbox Code Playgroud)

何时(如果有的话)将为此函数键入推理工作?

除了template<typename T1,...>void f(T1,T2,...)可能发生类型推断的地方之外还有其他地方吗?

一如既往,引用额外信贷的标准.

Bo *_*son 6

它永远不适用于嵌套类型,除非T也是一个参数.

如果调用f(1),编译器无法找到所有的T与嵌套的机会typedef int value_type;.

您可以推断出属于参数类型的类型,例如

template<class T>
void f(std::vector<T>);
Run Code Online (Sandbox Code Playgroud)


Sna*_*akE 5

我想这是你的答案:

14.8.2.4 - 从类型[temp.deduct.type]中推导出模板参数

[...]

-3- [...]

在大多数情况下,用于撰写的类型,模板和非类型值P参与模板参数推导.也就是说,它们可用于确定模板参数的值,并且如此确定的值必须与其他地方确定的值一致.但是,在某些上下文中,该值不参与类型推导,而是使用模板参数的值,这些参数可以在别处推导或明确指定.如果模板参数仅在非弱化上下文中使用且未明确指定,则模板参数推断将失败.

-4-非受限的上下文是:

  • 使用qualified-id 指定的类型的嵌套名称说明符.

  • 一种类型,它是一个template-id,其中一个或多个template-arguments是一个引用模板参数的表达式.

如果以包含非损坏上下文的方式指定类型名称,则包含该类型名称的所有类型也都是非限定的.但是,复合类型可以包括推导类型和非推导类型.[ 实施例:如果一个类型被指定为A<T>::B<T2>,两者TT2是nondeduced.同样地,如果一个类型被指定为A<I+J>::X<T>,I,J,和T是nondeduced.如果将类型指定为void f(A<T>::B, A<T>),则Tin A<T>::B为nondeuced但Tin A<T>推导出.]

T::value_type是类型的限定ID,因此其嵌套名称说明符中的类型是非限定的,必须明确指定.

编辑:此信息来自ISO/IEC 14882:1998.