【问题标题】:decltype deducted result of in-class defined functiondecltype 类内定义函数的扣除结果
【发布时间】:2017-05-10 18:58:05
【问题描述】:

为什么

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

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

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

编译失败

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

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

【问题讨论】:

  • 是的。成员函数体在逻辑上遵循类定义,即使是内联定义的。
  • 好吧,如果你可以对foo的返回类型使用简单的auto推导,为什么不将它也用于bar呢?
  • 我看不到decltype 的意义。我错过了什么吗?你在找auto& foo () { return i; } auto bar () ->decltype(auto) { return foo(); }吗?
  • @ZDF 编写编译时反射时出现此问题。首先,我编写了编译时字符串“whitch will be our foo”link(我们无法推断字符串的类型)其次,我编写了类变量和方法的编译时反射(删除了方法以简化代码)link(我们必须推导出所有结果类型,因为所有下一个状态都将取决于上一个状态)(我们的栏)。我想把它们放在一起,但会在课堂之外重写反射。

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


【解决方案1】:

在第一个 sn-p 中,我们可以推导出(有效的)返回类型,因为定义是在该词法点提供的——相反,如果 the definitions are lexically swapped 与 [dcl.spec.auto]/10 一致,则将不起作用,因为我们必须禁止循环演绎。

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

【讨论】:

  • 在我看来CWG1890 与这个问题有关。
  • @bogdan 我有点困惑,因为我觉得代码不应该首先格式错误,即如果当前的措辞比它应该的更禁止。
  • @bogdan CWG1890 是关于数据成员的类型。问题是关于函数声明。它是如何相关的?只是好奇,而不是批评。
  • 另外,请注意this->foo 在bar 的尾随返回类型中,如果foo 没有推导的返回类型(根据[expr.prim.this]/2),即使@987654332 @此时尚未完成。
  • @bogdan 是的,所以 CWG 643 被重新打开(他们应该在其中添加注释)。查看我的编辑。
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多