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
C++17模板推导指南不用于空参数集(第2版)?_C++_Templates_C++17_Template Argument Deduction - Fatal编程技术网

C++17模板推导指南不用于空参数集(第2版)?

C++17模板推导指南不用于空参数集(第2版)?,c++,templates,c++17,template-argument-deduction,C++,Templates,C++17,Template Argument Deduction,在GCC主干中仍然没有修复该错误之后,在模板推断指南中遇到了另一个奇怪的问题不幸的是: 包括 模板结构成功 { T值; constexpr成功(&v) :valuestd::movev { } constexpr successconst T&v :valuev { } }; 模板结构成功 { }; 模板成功/*未使用*/->成功; 成功->成功; 模板结构foo { foosuccess{} }; int mainvoid { 自动a=成功{5};//有效 自动b=成功{};//有效 自动c=

在GCC主干中仍然没有修复该错误之后,在模板推断指南中遇到了另一个奇怪的问题不幸的是:

包括 模板结构成功 { T值; constexpr成功(&v) :valuestd::movev { } constexpr successconst T&v :valuev { } }; 模板结构成功 { }; 模板成功/*未使用*/->成功; 成功->成功; 模板结构foo { foosuccess{} }; int mainvoid { 自动a=成功{5};//有效 自动b=成功{};//有效 自动c=success{hello};//工作正常 自动d=success5;//工作正常 //auto e=success;//在GCC 7.2上失败! 自动f=successhello;//工作正常 foo gsucces;//失败 静态资产std::is_same::value; 静态资产std::is_same::value; 静态资产std::is_same::value; 静态资产std::is_same::value; //静态资产std::is_same::value; 静态资产std::is_same::value; 返回0; } 至少对我来说,令人惊讶的一句话是:成功;未能在clang 6.0主干和GCC 7主干上使用模板扣减指南,如您在中看到的

我发现这令人惊讶,而不是人们所期望的。模板指南说,一个朴实无华的成功应该被视为成功。如果foo毫不含糊的构造函数接受了成功,那么这应该可以很好地工作。相反,clang 6.0中继报告:

34 : <source>:34:17: error: use of class template 'success' requires template arguments; argument deduction not allowed in function return type
    foo<void> g(success());     // FAILS
                ^~~~~~~
3 : <source>:3:27: note: template is declared here
template <class T> struct success
                          ^
<source>: In function 'int main()':
34 : <source>:34:25: error: 'auto' parameter not permitted in this context
     foo<void> g(success());     // FAILS
                         ^
和GCC 7.3中继报告:

34 : <source>:34:17: error: use of class template 'success' requires template arguments; argument deduction not allowed in function return type
    foo<void> g(success());     // FAILS
                ^~~~~~~
3 : <source>:3:27: note: template is declared here
template <class T> struct success
                          ^
<source>: In function 'int main()':
34 : <source>:34:25: error: 'auto' parameter not permitted in this context
     foo<void> g(success());     // FAILS
                         ^

有人能解释一下这是怎么回事吗?这是C++ 17标准中的一个缺陷吗?

< P>这是最令人烦恼的解析。< /P>
foo<void> g(success());     // FAILS
是一个名为g的函数的声明,该函数返回一个foo,并作为指向返回成功的空函数的指针类型的一个[unnamed]参数


但是,success不是一个类型,它是一个模板名,您不能将模板名用作函数的返回类型,只能使用完整类型。因此,出现了错误。

这是最令人烦恼的解析

foo<void> g(success());     // FAILS
是一个名为g的函数的声明,该函数返回一个foo,并作为指向返回成功的空函数的指针类型的一个[unnamed]参数


但是,success不是一个类型,它是一个模板名,您不能将模板名用作函数的返回类型,只能使用完整类型。因此,出现了错误。

我相信您遇到了一种新的最麻烦的解析形式

请记住,任何代码的语法形式都是在应用名称查找以外的任何语义规则之前确定的。既然模板名称在语法上是一个有效的简单类型说明符,那么就可以进行解析了

foo<void> g(success());
然而,我认为下面的双括号技巧也应该有效,但它只会导致来自clang的新错误消息。我不知道这是怎么回事:

foo<void> g4((success()));

我相信您已经遇到了一种新的最烦人的解析形式

请记住,任何代码的语法形式都是在应用名称查找以外的任何语义规则之前确定的。既然模板名称在语法上是一个有效的简单类型说明符,那么就可以进行解析了

foo<void> g(success());
然而,我认为下面的双括号技巧也应该有效,但它只会导致来自clang的新错误消息。我不知道这是怎么回事:

foo<void> g4((success()));

模板名称,而不是模板id。但是,成功不是类型,而是模板名称,并且不能将模板名称用作函数的返回类型,只能用作完整类型。因此,出现了错误。我现在明白问题所在了。未来标准的一个解决方法是,如果模板类型默认其所有模板参数,那么可以将默认值注入类型空间以及模板空间。是的,我同意这是一个非常糟糕的情况,但令人烦恼的解析问题阻止我用更干净的模板推导指导系统替换一组自由函数和垫片类型。这是悲哀的:模板名称,而不是模板id。但是,成功不是类型,而是模板名称,并且不能将模板名称用作函数的返回类型,只能使用完整类型。因此,出现了错误。我现在明白问题所在了。未来标准的一个解决方法是,如果模板类型默认其所有模板参数,那么可以将默认值注入类型空间以及模板空间。是的,我同意这是一个非常糟糕的情况,但令人烦恼的解析问题阻止我用更干净的模板推导指导系统替换一组自由函数和垫片类型。这是可悲的:好的,谢谢你对原因的确认。很难在这个答案和另一个答案之间做出选择,两者都很好,但这一个也有一个解决办法,所以我认为它更好。好的,感谢确认原因。很难在这个答案和另一个答案之间做出选择,两者都很好,但这个答案也有一个变通方法,所以我觉得它更好。