c ++ 1z错误:错误:扣除指南

时间:2017-06-13 04:37:51

标签: c++ c++17

我正在尝试使用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;之后的部分。不是。

在我看来,资格证书可以用于表达的一部分,但其他部分则不会有点混乱。有人能够解释为什么最后一个表达式有效的原​​因吗?

由于

1 个答案:

答案 0 :(得分:2)

演绎指南的语法不允许对您示例中的function进行限定。语法是:

deduction-guide:
    explicit(opt) template-name (parameter-declaration-clause) -> simple-template-id;

template-name 必须是标识符(因此它不能是限定名称), simple-template-id 指的是 template-name 及其模板参数。

如果编译器发出诊断(警告),编译器仍可允许冗余限定作为符合的扩展。如果没有至少一个警告,这是一个编译器错误,虽然我会等到C ++ 17完成后再提交错误报告。