【问题标题】:c++ 1z error: error: explicit qualification in declaration in deduction guidec ++ 1z错误:错误:演绎指南中声明中的显式限定
【发布时间】:2017-06-13 04:37:50
【问题描述】:

我正在尝试使用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 是一个声明,但 '->' 之后的部分似乎不是。

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

谢谢

【问题讨论】:

    标签: c++ c++17


    【解决方案1】:

    deduction-guide 的语法不允许在您的示例中对任一 function 进行限定。语法是:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2021-06-20
      • 2014-12-26
      相关资源
      最近更新 更多