C++ SFINAE和decltype(自动)

C++ SFINAE和decltype(自动),c++,auto,decltype,c++14,C++,Auto,Decltype,C++14,如果函数模板返回decltype(auto)(或另一个使用auto的类型说明符),但返回语句的格式不正确,是否会产生SFINAE?return语句是否被视为函数签名的直接上下文 N3690草案中似乎没有要求这样做。默认情况下,我猜SFINAE不适用 这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但您不能像编写手写体时那样将其存在条件设置为委托。此外,如果没有decltype(auto),则无法检查对等非静态成员函数的存在性,因为此不能用于函数签名。但是,这表明了一个基本问题,因为dec

如果函数模板返回
decltype(auto)
(或另一个使用
auto
的类型说明符),但返回语句的格式不正确,是否会产生SFINAE?
return
语句是否被视为函数签名的直接上下文

N3690草案中似乎没有要求这样做。默认情况下,我猜SFINAE不适用

这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但您不能像编写手写体时那样将其存在条件设置为委托。此外,如果没有
decltype(auto)
,则无法检查对等非静态成员函数的存在性,因为
不能用于函数签名。但是,这表明了一个基本问题,因为
decltype(auto)
提供了一种途径,可以将类类型视为成员签名中的完整类型,而不是

是否已编写提案,或是否已在任何地方对问题进行了正式分析

在成员签名中将类类型视为完整的能力可能还有其他含义……但这只是另一个问题的素材

但是返回语句的格式不正确,SFINAE是否会产生这种结果

他说,

SFINAE

由于返回类型是通过实例化模板推导出来的,如果实例化格式不正确,则会导致错误而不是替换失败。这允许自动函数返回lambda,这是使用decltype(返回表达式)模式无法实现的


希望这就是您想要的。

在纳瓦兹的链接之后,剩下的问题由N3690§7.1.6.4/11回答:

如果需要具有未简化占位符类型的实体类型来确定表达式的类型,则程序的格式不正确

这意味着,即使SFINAE使用返回类型推断,它也不能用于从一个函数声明查询另一个函数声明。在处理
return
语句之前,签名基本上是无效的,该语句发生在
class{}
定义的右括号处,并且在处理前面成员的定义之后

在某种意义上,所有成员
decltype(auto)
函数相对于同一类中的前面函数都是不完整的:

struct s {
    void f() { a(); } // error: use of ‘auto s::a()’ before deduction of ‘auto’
    auto a() { return 3; }
};

这是海湾合作委员会的投诉;如果成员声明被反转,它就会消失。这是因为当到达类定义中的
}
时,函数定义是按声明顺序处理的。如果语句
a()返回3之前处理code>,则程序格式不正确。

我一直在想这到底是什么。可悲的是,我也太懒了,不愿意接受你的建议…@MarkGarcia是的,这是必然的。我只是在问题的末尾加了一条注释;非模板成员可能仍然会在暮光地带打开一个虫洞。如果问题中有一些例子,对于像我这样的傻瓜来说,这会更容易理解。:)举个小例子可以让问题更清楚。也许还有其他方法可以达到你想要的。@n.m.总是有更多的方法。我没有被卡住,但我正在努力避免8次重复的过载。我在寻找的答案是一个指向提案文件的指针,这样我就可以判断是否自己写报告了。答对了!这正是我想要的。我现在需要继续,但我将在稍后阅读,以了解它们如何协调成员实例化和不完整类型。