c++ 1z error: error: explicit qualification in declaration in deduction guide

c++ 1z error: error: explicit qualification in declaration in deduction guide

我正在尝试使用 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...)>;
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

基于,应删除资格'std::'以使声明正确。

但是当我将推导指南声明更改为(注意在'->'之后添加了资格'std::')。没有编译器错误:

template<class R, class CLS, class ... ARGS> function(R(CLS::*)(ARGS ...))-> std::function< R(CLS &, ARGS...)>;

我假设整个 express 都是声明,但'->'之后的部分似乎不是。

在我看来,限定词可以用在表达式的一部分上,而不能用在其他部分上,这有点令人困惑。谁能解释最后一个表达式有效的原​​因?

谢谢

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

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

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

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