模板代码中的默认类型参数错误

Rog*_*nes 6 c++ templates

1)template <class T = int, class U = double> //compiles

2)template <class T, class U =double> //compiles

3)template <class T = int, class U> //fails
Run Code Online (Sandbox Code Playgroud)

为什么1和2编译而3不编译?

ybu*_*ill 8

出于同样的原因:

void f(int = 0, int);
Run Code Online (Sandbox Code Playgroud)

失败.

无法使用第3版默认参数:

template<class T = int, class U> class B { ... };

B<, short> var; // ??? no such syntax
Run Code Online (Sandbox Code Playgroud)


Pra*_*rav 6

(3) 是不正确的,因为

C++ 03 [ Section 14.1/11]说

如果template-parameter具有默认的template-argument,则所有后续模板参数都应提供默认的template-argument.

  • 很棒的答案+1.我在哪里可以获得该标准的副本? (2认同)

Unc*_*ens 6

如果你把它放到某个上下文中,第三种方式实际上可能是合法的,前提是先前已经给出了第二个默认值.

template <class T, class U = double>
struct X;

template <class T = int, class U> //here
struct X {};

int main()
{
    X<> x;
    X<float> y;
    X<char, char> z;
}
Run Code Online (Sandbox Code Playgroud)