为什么
struct MyStruct {
auto foo () { return 1; }
auto bar () { return foo(); }
};
编译,但是当使用这样的尾随返回类型时:
struct MyStruct {
auto foo () { return 1; }
auto bar () -> decltype(foo()) { return foo(); }
};
编译失败,
错误:功能' foo'具有推导的返回类型在定义之前不能使用
这是对实施的正确行为吗?部分?
答案 0 :(得分:11)
在第一个片段中,我们可以推导出(有效)返回类型,因为定义是在该词汇点提供的 - 相反,如果the definitions are lexically swapped与[dcl.spec.auto]/10一致,则无效。因为我们必须禁止循环扣除。
关于第二个代码段,请参阅core issue 945,它有效地重新打开core issue 643并处理在尾随返回类型中使用的this
,其中类类型仍然不完整。 AFAICS,目前的措辞允许它采用与第一种情况相同的方式(再次给出正确的定义顺序),但要记住公开问题1890;供应商推迟实施可疑的东西,直到确认。