C++ c++;1z错误:错误:扣减指南声明中的明确限定
我使用gcc 8.0.0 201706尝试了一个关于1z的演绎指南的示例(无法使用clang 5.0.5编译代码)C++ c++;1z错误:错误:扣减指南声明中的明确限定,c++,c++17,C++,C++17,我使用gcc 8.0.0 201706尝试了一个关于1z的演绎指南的示例(无法使用clang 5.0.5编译代码) 名称空间std { 模板std::function(R(CLS::*)(ARGS…)->functionstd::function”声明中的显式限定 ->函数; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ 根据资格,应删除“std::”以使声明正确 但是,当我将扣减指南声明更改为(请注意,“->”之后添加了限定条件“std::”。没有编译器错误: template&
名称空间std
{
模板std::function(R(CLS::*)(ARGS…)->function
编译器抱怨说
error: explicit qualification in declaration of 'std::function(R (CLS::*)(ARGS ...))-> std::function<R(CLS&, ARGS ...)>'
-> function< R(CLS &, ARGS...)>;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
错误:“std::function(R(CLS::*)(ARGS…)->std::function”声明中的显式限定
->函数;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
根据资格,应删除“std::”以使声明正确
但是,当我将扣减指南声明更改为(请注意,“->”之后添加了限定条件“std::”。没有编译器错误:
template<class R, class CLS, class ... ARGS> function(R(CLS::*)(ARGS ...))-> std::function< R(CLS &, ARGS...)>;
模板函数(R(CLS::*)(ARGS…)->std::function
我假设整个表达式是一个声明,但“->”后面的部分似乎不是
在我看来,限定可以用在表达式的一部分,但不能用在其他部分,这有点令人困惑。有人能解释最后一个表达式有效的原因吗
谢谢在您的示例中,扣减指南的语法不允许对函数
进行限定。语法是:
deduction-guide:
explicit(opt) template-name (parameter-declaration-clause) -> simple-template-id;
模板名称必须是标识符(因此不能是限定名称),简单模板id指的是模板名称及其模板参数
如果编译器发出诊断(即警告),编译器仍可以允许冗余鉴定作为一致性扩展。如果没有至少一个警告,那就是编译器错误,尽管我会等到C++17完成后再提交错误报告
deduction-guide:
explicit(opt) template-name (parameter-declaration-clause) -> simple-template-id;