【问题标题】:Is void{} legal or not?void{} 是否合法?
【发布时间】:2017-01-14 05:02:19
【问题描述】:

这是this问题的后续跟进。
在 cmets 和答案中,不止一次提到 void{} 既不是有效的类型 ID,也不是有效的表达式

这很好,很有意义,仅此而已。

然后我通过了工作草案的[7.1.7.4.1/2]占位符类型推演)。
据说:

[...]
- 对于在使用包含占位符类型的返回类型声明的函数中出现的未丢弃的return 语句,T 是声明的返回类型,ereturn 语句的操作数。如果return 语句没有操作数,则evoid{}
[...]

那么,void{}(在概念上)是否合法?
如果工作草案中提到它是可以接受的(即使只是作为一个 - 就好像它是一个 - 声明),它必须确实是合法的。这意味着decltype(void{}) 也应该是有效的,例如。
否则,工作草案是否应该使用void() 而不是void{}


好吧,老实说,我很确定我不够熟练,无法指出工作草案中的错误,所以真正的问题是:我的推理出了什么问题?
上面的项目符号中提到的void{} 到底是什么?为什么在这种情况下它是合法的表达方式?

【问题讨论】:

  • 我会(微弱地)怀疑工作草案错误...这就是为什么它是工作草案而不是标准? :)
  • @Yakk:当然,提交问题仍然是个好主意。
  • 嗯,今天知道你可以return void();
  • @AndyG void() 可以用在你想象不到的地方... :-)
  • @skypjack:按照您的问题跟踪,现在看来您将成为专家 :-)

标签: c++ language-lawyer void c++17 return-type-deduction


【解决方案1】:

对我来说,这听起来像是有人将旧标准与新标准合并在一起时搞砸了。

以前的标准是这样说的:(C++14 N4140, 7.1.6.4.7 [dcl.spec.auto]):

当函数中出现 [...] return 语句时 使用包含占位符类型、推导的返回类型或变量类型的返回类型声明 由其初始化程序的类型确定。对于没有操作数的return,初始化程序是 被认为是void()

较新的标准允许使用if constexpr 语句,因此需要更改语言以反映这一点。 if constexpr 导致潜在丢弃 return 语句的概念(如果return 在 constexpr if 的未采用分支中,则它被丢弃并从推断返回类型其他返回语句,如果有的话)。

可能新的措辞应该是这样的:

对于出现在函数中的非丢弃返回语句 使用包含占位符类型的返回类型声明,T 是 声明的返回类型和ereturn 语句的操作数。如果 return 语句没有操作数,则Tauto 推导出的返回类型为void

【讨论】:

  • 1.类型应为void(),既不是void{},也不是void。 2.你没有真正回答标题中的问题:void{}合法吗?不,不是。 :-) 3. 不确定constexpr if 是否有罪。你为什么这样说?还是谢谢你的详细回答。
  • @skypjack:不,类型不应该是void()。目前的措辞是evoid{},AndyG 只是谈论类型而没有尝试为e 编写表达式。
  • N4296 是 C++17 草案。 C++14 文本是 N4140。您引用的文本在 C++14 和 N4296 之间有所不同。
  • @MM 很高兴知道。我太便宜了,无法获得真正的文本,所以我使用了推荐的后备 isocpp (N4296)。
  • N4140 是免费提供的,修改您的答案是个好主意(使用 N4140 的报价;或者不声称报价来自 C++14)
【解决方案2】:

确认错误。已经修复。
Here 是讨论(说实话很简短)。

所以,答案是 - 不,void{} 不合法
这是工作草案的一个措辞错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 2021-06-06
    • 2017-01-09
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多