Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++ 何时提供默认参数作为模板参数 模板 结构测试{}; 模板 无效函数(测试){/#1 } int main(){ func(Test{});/#2 }_C++_Language Lawyer - Fatal编程技术网

C++ 何时提供默认参数作为模板参数 模板 结构测试{}; 模板 无效函数(测试){/#1 } int main(){ func(Test{});/#2 }

C++ 何时提供默认参数作为模板参数 模板 结构测试{}; 模板 无效函数(测试){/#1 } int main(){ func(Test{});/#2 },c++,language-lawyer,C++,Language Lawyer,标准中似乎没有规则提到模板参数需要默认参数的情况 在 如果在参数声明中指定了初始值设定项子句,则此初始值设定项子句将用作默认参数。默认参数将用于缺少尾随参数的调用 在本节中,规则明确描述了何时为函数调用提供默认参数。但是,我在标准中没有找到与上面描述何时提供默认参数作为模板参数的语句类似的引用 例如在#1处进行测试。也许在#1,专门化将是测试,这只是推断。但是,标准中没有明确描述这一点的正式术语 以下规则中唯一将默认参数作为模板参数引用: 当简单模板id未命名函数时,默认模板参数将在需要该默认

标准中似乎没有规则提到模板参数需要默认参数的情况

如果在参数声明中指定了初始值设定项子句,则此初始值设定项子句将用作默认参数。默认参数将用于缺少尾随参数的调用

在本节中,规则明确描述了何时为函数调用提供默认参数。但是,我在标准中没有找到与上面描述何时提供默认参数作为模板参数的语句类似的引用

例如在
#1
处进行
测试。也许在
#1
,专门化将是
测试
,这只是推断。但是,标准中没有明确描述这一点的正式术语

以下规则中唯一将默认参数作为模板参数引用:

当简单模板id未命名函数时,默认模板参数将在需要该默认参数的值时隐式实例化。[ 示例:
模板结构S{};
S*p;//p的类型是S*
U的默认参数是实例化的,以形成类型
S*。 — 结束示例 ]


考虑
#1
处的代码,是否需要在
#1
处使用默认参数?如果需要,则在该点使用默认参数(因为如果我没有为模板参数U指定默认参数,则在
#1
处将发生错误。请参阅),根据上面的引文,默认模板参数需要隐式实例化
,但是在这一点上,
T
是一个模板参数,并且该函数模板的定义没有实例化任何内容(这一点上只是一个函数模板定义).那么,这段话是怎么解释的呢?

里面还有一段:

模板id在以下情况下有效:

  • 每个不可推断的非打包参数都有一个参数,该参数没有默认的模板参数

这样可以考虑缺省参数意味着需要一个默认参数来使模板ID有效,并且当缺少模板参数时,该参数是默认的参数值。但是在类模板的标准中没有找到任何明确的。对于函数模板,这是更多的。可能是NOB。ody指出了标准中的这一漏洞,因为这是一种常见模式:默认值用于替代用户未提供的内容。可能不会更改,因为英语词典中已经给出了默认值的定义:

如果你没有做出任何不同的选择,事情将自动发生或出现的方式,尤其是在计算机上 --

根据上面的引文,默认模板参数需要隐式实例化,但是在这一点上,
T
是一个模板参数,这样的函数模板的定义没有实例化任何东西(在这一点上它只是一个函数模板定义)。那么,引文如何解释这一点呢

关键是实例化的需要和引用时的区别。在中的示例中,
U
的默认模板参数被实例化,因为它是
S
实例化所需的,这明确地解析为
S
。在OP自己的示例中,实例化依赖于de的
U
的故障模板参数只有在重载解析解决
void func(测试)后才会出现
作为最佳可行的重载,并对其进行实例化。但是,作为重载解决方案的一部分,仅检查候选重载不会导致实例化任何候选重载,也不会导致实例化任何本身就是模板的函数模板候选参数。但是,它将引用所述模板参数作为其一部分超负荷解决过程(丢弃不可行的候选者)


从[强调我的]:

当引用函数模板专用化时,所有模板参数都应具有值。可以明确指定值,或者在某些情况下,可以从使用中推断值,或者从默认的模板参数中获得值。[…]

对于OP的特定示例,前者(实例化)仅在重载解析完成后发生,并且实例化了一个最佳可行的重载(这反过来实例化了类模板函数参数)。后者(引用函数/类模板专门化)但是,在重载解析过程中,也适用,即使丢弃不可行或不是最佳可行匹配的候选项,也不会导致实例化的候选项

从[强调我的]:

指定显式模板参数列表时,模板参数必须与模板参数列表兼容,并且必须产生如下所述的有效函数类型;否则类型推断失败。具体而言,在计算显式指定的模板参数列表时,将执行以下步骤与给定函数模板相关的ist:

  • (2.1)指定的模板参数必须以实物形式与模板参数相匹配(即类型、非类型、模板)。除非[…]否则参数不得多于参数
从[强调我的]:

在模板参数推导过程中的某些点上,有必要