【发布时间】: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 是一个声明,但 '->' 之后的部分似乎不是。
在我看来,可以在表达式的一个部分使用限定符,但不能在其他部分使用,这有点令人困惑。有谁能解释最后一个表达式有效的原因吗?
谢谢
【问题讨论】: