SFINAE和decltype(自动)

时间:2013-07-12 06:23:00

标签: c++ auto decltype c++14

如果函数模板返回decltype(auto)(或使用auto的其他类型说明符)但返回语句格式不正确,SFINAE会导致吗? return语句是否被认为是函数签名的直接上下文?

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

这看起来很不幸,因为你可以编写一个函数来转发给另一个函数,但是当你写一个longhand时,你不能使它的存在以委托为条件。此外,如果没有decltype(auto),则无法检查是否存在对等非静态成员函数,因为this不能在函数签名中使用。然而,这表明存在一个基本问题,因为decltype(auto)提供了一种在成员签名中将类类型视为完整的路径,而不是。{/ p>

是否已撰写提案,或者问题是否已在任何地方进行过正式分析?

在成员签名中将类类型视为完整的能力可能有其他含义......但这只是另一个问题的补充。

2 个答案:

答案 0 :(得分:15)

  

但是返回声明将是不正确的,SFINAE会导致吗?

proposal-n3638说,

  

<强> SFINAE

     

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

希望这就是你要找的东西。

答案 1 :(得分:3)

跟进Nawaz的链接,其余的问题由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();之前处理语句return 3;,则该程序格式不正确。