创建对象时,什么是空模板参数<>?

Nar*_*rek 17 c++ templates c++11

这是一些有效的语法:

std::uniform_real_distribution<> randomizer(0, 100);
Run Code Online (Sandbox Code Playgroud)

它是如何工作的,是否自动推导出对象模板?为什么有必要<>在类型的末尾写?我可以不删除它<>,它会是一样的吗?

Nia*_*all 22

通常,当第一个和后一个或仅有参数具有默认模板参数(如果它是一个整数的类型或值)时,可以使用它并且它可以工作.另一种情况是存在模板参数包并且它是空的.

<>仍然需要将其识别为一个模板类型.

在这种情况下,类型声明为 ;

template <class RealType = double>
class uniform_real_distribution;
Run Code Online (Sandbox Code Playgroud)

因此RealType模板类的默认值uniform_real_distributiondouble.它相当于std::uniform_real_distribution<double>.


参考C++ WD n4527,§14.3/4(模板参数)

使用模板参数包或默认模板参数时,模板参数列表可以为空.在这种情况下,空<>括号仍应用作模板参数列表.[ 例如:

template<class T = char> class String;
String<>* p; // OK: String<char>
String* q;   // syntax error

template<class ... Elements> class Tuple;
Tuple<>* t; // OK: Elements is empty
Tuple* u;   // syntax error
Run Code Online (Sandbox Code Playgroud)

- 结束例子 ]


Vla*_*cow 7

该课程有以下声明

template<class RealType = double>
class uniform_real_distribution;
Run Code Online (Sandbox Code Playgroud)

如您所见,它具有类型的默认模板参数 double

所以这个宣言

std::uniform_real_distribution<> randomizer(0, 100);
Run Code Online (Sandbox Code Playgroud)

相当于

std::uniform_real_distribution<double> randomizer(0, 100);
Run Code Online (Sandbox Code Playgroud)