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

zat*_*tm8 22 c++ language-lawyer return-type-deduction c++14

为什么

struct MyStruct {
   auto foo () { return 1; }
   auto bar () { return foo(); }
};
Run Code Online (Sandbox Code Playgroud)

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

struct MyStruct {
   auto foo () { return 1; }
   auto bar () -> decltype(foo()) { return foo(); }
};
Run Code Online (Sandbox Code Playgroud)

编译失败了

错误:在定义返回类型之前,不能使用带有推导返回类型的函数'foo'

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

Col*_*mbo 11

在第一个片段中,我们可以推导出(有效)返回类型,因为定义是在该词汇点提供的 - 如果定义是词汇交换的话,相反则不起作用,这与[dcl.spec.auto] /一致10,因为我们必须禁止循环扣除.

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