我正在尝试使用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,应删除限定符“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;

模板名称必须是标识符(因此不能为限定名称),并且simple-template-id引用模板名称及其模板参数。

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

关于c++ - c++ 1z错误:错误:扣除指南中声明的显式限定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44512494/

10-10 13:19