C++ c++;1z错误:错误:扣减指南声明中的明确限定

C++ c++;1z错误:错误:扣减指南声明中的明确限定,c++,c++17,C++,C++17,我使用gcc 8.0.0 201706尝试了一个关于1z的演绎指南的示例(无法使用clang 5.0.5编译代码) 名称空间std { 模板std::function(R(CLS::*)(ARGS…)->functionstd::function”声明中的显式限定 ->函数; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 根据资格,应删除“std::”以使声明正确 但是,当我将扣减指南声明更改为(请注意,“->”之后添加了限定条件“std::”。没有编译器错误: template&

我使用gcc 8.0.0 201706尝试了一个关于1z的演绎指南的示例(无法使用clang 5.0.5编译代码)

名称空间std
{
模板std::function(R(CLS::*)(ARGS…)->function
编译器抱怨说

error: explicit qualification in declaration of 'std::function(R (CLS::*)(ARGS ...))-> std::function<R(CLS&, ARGS ...)>'
         -> function< R(CLS &, ARGS...)>;
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
错误:“std::function(R(CLS::*)(ARGS…)->std::function”声明中的显式限定
->函数;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
根据资格,应删除“std::”以使声明正确

但是,当我将扣减指南声明更改为(请注意,“->”之后添加了限定条件“std::”。没有编译器错误:

template<class R, class CLS, class ... ARGS> function(R(CLS::*)(ARGS ...))-> std::function< R(CLS &, ARGS...)>;
模板函数(R(CLS::*)(ARGS…)->std::function
我假设整个表达式是一个声明,但“->”后面的部分似乎不是

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

谢谢

在您的示例中,扣减指南的语法不允许对
函数
进行限定。语法是:

deduction-guide:
    explicit(opt) template-name (parameter-declaration-clause) -> simple-template-id;
模板名称必须是标识符(因此不能是限定名称),简单模板id指的是模板名称及其模板参数

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

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