考虑一个例子:
#include <type_traits>
#include <string>
template <template <class> class TT> //#1
struct Foo {
static void foo() {
static_assert(std::is_same_v<decltype(TT("abc")), TT<std::string>>);
}
};
template <class T>
struct Bar {
Bar(T) {}
};
template <class T>
Bar(T) -> Bar<std::string>; //#2
int main() {
Foo<Bar>::foo();
}
在推断模板模板参数(#1)的模板参数时,
答案 0 :(得分:4)
是的,这是符合标准的。
{em}类型说明符,格式为
typename
opt nested-name-specifier opt template-name 是推断类类型的占位符([dcl.type.class.deduct])。 template-name 应命名一个不是注入类名的类模板。
type-parameter ,其标识符不遵循省略号,将其标识符定义为 typedef-name (如果声明没有
template
)或 template-name (如果用template
声明)在模板声明的范围内。
TT
是使用template
声明的类型参数,它使其成为模板名称,因此是推断类类型的占位符。所有通常的规则都适用。