C++ 1Z 错误:错误:演绎指南中声明中的显式限定

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

本文关键字:错误 1Z 演绎 C++ 声明      更新时间:2023-10-16

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

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...)>;
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

根据声明C++明确的限定,应删除限定"std::"以使声明正确。

但是当我将演绎指南声明更改为(请注意,在"->"之后添加了限定"std::"(。没有编译器错误:

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

我假设整个表达是一个声明,但似乎"->"之后的部分不是。

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

谢谢

在你的例子中,演绎指南的语法不允许对任何一个function进行限定。语法为:

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

必须是标识符(因此它不能是限定名称(,简单模板 ID 引用模板名称及其模板参数。

编译器可能仍允许冗余限定为符合要求的扩展,前提是它发出诊断(警告(。如果没有至少警告,那就是编译器错误,尽管我会等到 C++17 最终确定后再提交错误报告。