我正在尝试使用gcc 8.0.0 201706(无法获取使用clang 5.0.5编译的代码)的1z扣除指南的示例。
namespace std
{
template<class R, class CLS, class ... ARGS> std::function(R(CLS::*)(ARGS ...)) -> function< R(CLS &, ARGS...)>;
}
编译器抱怨
error: explicit qualification in declaration of 'std::function(R (CLS::*)(ARGS ...))-> std::function<R(CLS&, ARGS ...)>'
-> function< R(CLS &, ARGS...)>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
基于explicit qualification in C++ declaration资格&#39; std ::&#39;应该删除以使声明正确。
但是,当我将演绎指南声明更改为(注意资格&#39; std ::&#39;在&#39; - &gt;&#39;之后添加)。没有编译器错误:
template<class R, class CLS, class ... ARGS> function(R(CLS::*)(ARGS ...))-> std::function< R(CLS &, ARGS...)>;
我认为整个快递是一个声明,但它似乎是&#39; - &gt;&#39;之后的部分。不是。
在我看来,资格证书可以用于表达的一部分,但其他部分则不会有点混乱。有人能够解释为什么最后一个表达式有效的原因吗?
由于
答案 0 :(得分:2)
演绎指南的语法不允许对您示例中的function
进行限定。语法是:
deduction-guide:
explicit(opt) template-name (parameter-declaration-clause) -> simple-template-id;
template-name 必须是标识符(因此它不能是限定名称), simple-template-id 指的是 template-name 及其模板参数。
如果编译器发出诊断(即警告),编译器仍可允许冗余限定作为符合的扩展。如果没有至少一个警告,这是一个编译器错误,虽然我会等到C ++ 17完成后再提交错误报告。