decltype扣除了类内定义函数的结果

时间:2016-12-26 09:31:17

标签: c++ c++14 language-lawyer return-type-deduction

为什么

struct MyStruct {
   auto foo () { return 1; }
   auto bar () { return foo(); }
};

编译,但是当使用这样的尾随返回类型时:

struct MyStruct {
   auto foo () { return 1; }
   auto bar () -> decltype(foo()) { return foo(); }
};

编译失败,

  

错误:功能' foo'具有推导的返回类型在定义之前不能使用

这是对实施的正确行为吗?部分?

1 个答案:

答案 0 :(得分:11)

在第一个片段中,我们可以推导出(有效)返回类型,因为定义是在该词汇点提供的 - 相反,如果the definitions are lexically swapped[dcl.spec.auto]/10一致,则无效。因为我们必须禁止循环扣除。

关于第二个代码段,请参阅core issue 945,它有效地重新打开core issue 643并处理在尾随返回类型中使用的this,其中类类型仍然不完整。 AFAICS,目前的措辞允许它采用与第一种情况相同的方式(再次给出正确的定义顺序),但要记住公开问题1890;供应商推迟实施可疑的东西,直到确认。