Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+的要求是什么+;模板参数? 如果您使用C++中的模板,将整数值作为参数,那么对于作为参数调用的整数变量是否有不同的要求,如果变量在函数调用中用作参数?p>_C++_Templates_Parameters_Constants_Extern - Fatal编程技术网

C+的要求是什么+;模板参数? 如果您使用C++中的模板,将整数值作为参数,那么对于作为参数调用的整数变量是否有不同的要求,如果变量在函数调用中用作参数?p>

C+的要求是什么+;模板参数? 如果您使用C++中的模板,将整数值作为参数,那么对于作为参数调用的整数变量是否有不同的要求,如果变量在函数调用中用作参数?p>,c++,templates,parameters,constants,extern,C++,Templates,Parameters,Constants,Extern,这是问题的后续行动。我特别想说明,对于函数或模板,WRT变量声明为“extern const int”是否存在差异 我可以看到,对于某些模板情况,在编译时需要参数值。这总是真的吗?是否有一种方法可以指定(可能仅用于参数值的某些用途)在运行时使用该值 编译时总是需要int的值 由于每个模板实例化都是一段单独的编译代码(即使对于整型模板参数也是如此),因此整型在编译时需要可用(并且必须保证它永远不会更改) 这也是为什么在使用大量唯一值时不使用整数模板参数是一个好主意-您可以很快得到一个巨大的可执行文

这是问题的后续行动。我特别想说明,对于函数或模板,WRT变量声明为“extern const int”是否存在差异


我可以看到,对于某些模板情况,在编译时需要参数值。这总是真的吗?是否有一种方法可以指定(可能仅用于参数值的某些用途)在运行时使用该值

编译时总是需要int的值

由于每个模板实例化都是一段单独的编译代码(即使对于整型模板参数也是如此),因此整型在编译时需要可用(并且必须保证它永远不会更改)


这也是为什么在使用大量唯一值时不使用整数模板参数是一个好主意-您可以很快得到一个巨大的可执行文件。

以下内容来自标准

14.3.2.1:

非类型、非模板参数的模板参数应为以下参数之一:

  • 整型或枚举型的整型常量表达式;或
  • 非类型模板参数的名称;或
  • 具有外部链接的对象或函数的地址,包括函数模板和函数模板id,但不包括非静态类成员,表示为&id表达式,如果名称引用函数或数组,或者如果相应的模板参数是引用,则&id是可选的;或
  • 指向构件的指针,如5.3.1所述
5.19.1:

在几个地方,C++需要计算为一个积分或枚举常数的表达式:作为数组边界(8 3.4,5.3.4),作为case表达式(6 .4.2),作为位字段长度(9.6),作为枚举器初始化器(7.2),作为静态成员初始化器(9 4.2),以及作为整数或枚举非类型模板参数(14.3)。 整型常量表达式只能涉及整型或枚举类型的文字(2.13)、枚举数、常量变量或静态数据成员(使用常量表达式初始化)(8.5)、整型或枚举类型的非类型模板参数以及sizeof表达式。浮动文字(2.13.3)仅在强制转换为整型或枚举类型时才会出现。仅将类型转换为integral或enumera- 可以使用默认类型。特别是,除sizeof表达式外,不得使用函数、类对象、指针或引用,也不得使用赋值、递增、递减、函数调用或逗号运算符


关于你之前的帖子,我相信“常量变量…初始化为…”部分的本质(我认为外部初始化并不重要)。

它必须是一个积分常量表达式。标准文件
5.19
对此进行了解释:

整型常量表达式只能涉及整型或枚举类型的文字(2.13)、枚举数、常量变量或静态数据成员(使用常量表达式初始化)(8.5)、整型或枚举类型的非类型模板参数以及sizeof表达式。浮动文字(2.13.3)仅在强制转换为整型或枚举类型时才会出现。只能使用到整型或枚举类型的类型转换

请注意,“integral”是“integer”的另一个术语,但与“int”不同。例如,“char”具有整数/整数类型,但显然不是int类型。因此,具体而言,以下是允许的

  • 10或10L或类似的东西
  • enum{这个或那个}
  • int const this_one=10
  • sizeof(char)
  • 当然,上面详述的任何其他模板参数
这些参数中的任何一个都可以用作具有相应类型的整型参数的模板参数。不过,一些转换仍然适用。因此,如果它需要一个int,而您传递了一个char,它会自动将char提升为int。如果您提供了一个枚举数,它需要一个int,也是如此

根据这些规则,如果你有

extern const int SomeName;
它没有看到一个定义,用整型常量表达式初始化该常量,它不能用作模板参数。当然,它也可以用作函数参数。这些不需要在编译时知道,因为它们不是类型的一部分。命名模板专门化时,所使用的参数将成为类型的一部分:

MyGreatStack<int, 4> // 4 is now part of the type MyGreatStack<int, 4>!
它将接受上面的
SomeName
。现在,选择了一个在整个程序中唯一的特定位置(变量为
extern
linkage),而不是一个值

MyGreatStack<int, 4> // 4 is now part of the type MyGreatStack<int, 4>!
template<const int& V> struct NowItWorks { };