默认模板参数的范围是什么?

Adi*_*dib 18 c++ templates c++14

标准(§14.1)模板参数说:

允许模板模板参数的模板参数具有默认模板参数.

现在考虑以下代码:

#include <iostream>

using namespace std;

struct A {};
struct B {};

template<typename T = A>
struct X;

template<>
struct X<A> {
   static void f() { cout << 1 << endl; }
};

template<>
struct X<B> {
   static void f() { cout << 2 << endl; }
};

template< template<typename T = B> class C>
void g() {
   C<>::f();
}

int main() {
   g<X>();
}
Run Code Online (Sandbox Code Playgroud)

它的输出是:

出局:2

在这种情况下,模板模板参数是C.
但我不明白为什么 C<B>::f()被称为内部g().

Vla*_*cow 7

这个宣言

template< template<typename T = B> class C>
void g() {
   C<>::f();
}
Run Code Online (Sandbox Code Playgroud)

相当于

template< template<typename T = B> class C>
void g() {
   C<B>::f();
}
Run Code Online (Sandbox Code Playgroud)

因此这个电话

   g<X>();
Run Code Online (Sandbox Code Playgroud)

相当于函数的调用

void g() {
   X<B>::f();
}
Run Code Online (Sandbox Code Playgroud)

C++标准的第14.1.14段包含相应的示例

14模板模板参数的模板参数允许具有默认模板参数.如果指定了此类默认参数,则它们将应用于模板template-parameter范围内的模板template-parameter.[例:

template <class T = float> struct B {}; 
template <template <class TT = float> class T> struct A {
 inline void f();
 inline void g(); 
}; 
template <template <class TT> class T> void A<T>::f() {
 T<> t; // error - TT has no default template argument 
} 
template <template <class TT = char> class T> void A<T>::g() {
 T<> t; // OK - T<char> 
} 
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

  • `C <T>`会形成错误,`T`没有在`g`的范围内声明. (3认同)