剖析C++中的常量表达式与省略号的相关作用
C++常量表达式
常量值是指不会更改的值。C++提供了两个关键字,它们使你能够表达不打算修改对象的意图,还可让你实现该意图。
C++需要常量表达式(计算结果为常量的表达式)以便声明:
- 数组边界
- case语句中的选择器
- 位域长度规范
- 枚举初始值设定项
常量表达式中合法的唯一操作数是:
- 文本
- 枚举常量
- 声明为使用常量表达式初始化的常量的值
- sizeof表达式
必须将非整型常量(显式或隐式)转换为常量表达式中合法的整型。因此,以下代码是合法的:
constdoubleSize=11.0; charchArray[(int)Size];
到整型的显式转换在常量表达式中是合法的;所有其他类型和派生类型是非法的(在用作sizeof运算符的操作数时除外)。
逗号运算符和赋值运算符不能用于常量表达式。
省略号和可变参数模板
省略号在C和C++中具有许多用途。这些包括函数的变量参数列表。C运行库的printf()函数是一种最常见的示例。
variadic模板是支持任意数量的参数的类或函数模板。此机制对C++库开发人员尤其有用,因为您可以将其应用于类模板和函数模板,从而提供一系列类型安全和重要功能以及灵活性。
语法
可变参数模板用两种方法使用省略号。参数名称的左侧表示参数包,参数名称的右侧将参数包扩展为单独的名称。
以下是可变参数模板类定义语法的基本示例:
template<typename...Arguments>classclassname;
如以下示例所示,对于参数装箱和展开,可以根据您的喜好在省略号周围添加空白,例如:
template<typename...Arguments>classclassname;
或为:
template<typename...Arguments>classclassname;
请注意本文使用的是显示在第一个例子中约定(该省略号附加于typename).
在前面的示例中,Arguments是参数包。类classname可以接受参数数目可变,例如以下示例:
template<typename...Arguments>classvtclass; vtclass<>vtinstance1; vtclass<int>vtinstance2; vtclass<float,bool>vtinstance3; vtclass<long,std::vector<int>,std::string>vtinstance4;
通过使用可变参数模板类定义,您还可以要求至少一个参数。
template<typenameFirst,typename...Rest>classclassname;
以下是可变参数模板函数语法的基本示例:
template<typename...Arguments>returntypefunctionname(Arguments...args);
如下一节“了解可变参数模板”所示,Arguments参数包展开使用。
variadic模板函数语法还可能有其他形式,包括不限制于:
template<typename...Arguments>returntypefunctionname(Arguments&...args); template<typename...Arguments>returntypefunctionname(Arguments&&...args); template<typename...Arguments>returntypefunctionname(Arguments*...args);
还允许使用类似const的说明符:
template<typename...Arguments>returntypefunctionname(constArguments&...args);
按照可变参数模板类的定义,您可以创建需要至少一个参数的函数:
template<typenameFirst,typename...Rest>returntypefunctionname(constFirst&first,constRest&...args);