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 完成后再提交错误报告。
我正在尝试使用 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::')。没有编译器错误:
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 完成后再提交错误报告。