繁体   English   中英

别名模板,部分专业化和无效的参数类型void

[英]Alias template, partial specialization and the invalid parameter type void

考虑以下代码:

template<typename F>
struct S;

template<typename Ret, typename... Args>
struct S<Ret(Args...)> { };

template<typename... Args>
using Alias = S<void(Args...)>;

int main() {
    S<void(int)> s;
    Alias<int> alias;
}

正如预期的那样,它运行良好,并且涉及S的行和涉及Alias的行都在Alias定义了相同的类型S<void(int)>

现在,请考虑以下更改:

int main() {
    S<void(void)> s;  // this line compiles
    Alias<void> alias;  // this line does not
}

我希望它可以编译,原因与上述原因相似。
不用说,由于涉及Alias的行,它无法编译,相反,我得到了错误:

代替“使用Alias = S [with Args = {void}]的模板”

[...]

错误:参数类型无效'void'

问题很简单:我在这里错过了什么?

在[dcl.fct]中,重点是:

不相关类型为void的单个未命名参数组成的参数列表等效于空参数列表。 除这种特殊情况外,参数不得具有cv void类型。

在这种情况下, Args...是一个依赖类型包,因此那里不允许void 在[temp.deduct]的注释中重复了这个想法:

[注意:类型推断可能由于以下原因而失败:
— [...]
—尝试创建一个函数类型,其中参数的类型为void ,或者返回类型为函数类型或数组类型。
— [...]
—尾注]

需要注意的是S<void(void)>编译自void(void)非依赖性和等同于void()这样Ret(Args...)永远不会推导出有void的参数列表-它推导与Args...空。


至少有一个简单的解决方法,您可以只编写Alias<>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM