【问题标题】:Why can I use void(), but not void{}? [duplicate]为什么我可以使用 void(),但不能使用 void{}? [复制]
【发布时间】:2018-12-14 17:18:13
【问题描述】:

考虑以下代码:

void foo() { return void(); }
void bar() { return void{}; }

foo() 编译,但 bar() doesn't(在 GodBolt 上使用 GCC 8.2 和 clang 7.0)。

为什么?

【问题讨论】:

  • 因为它是无效的语法。不知道为什么void() 有效。你真的会写这样的代码吗?
  • 返回T{};的模板代码?
  • @ShafikYaghmour 链接的相关问题是对您问题的令人惊讶的完整答案。
  • @John:首先,void() 是函数式转换,而不是 C 风格的转换。其次,泛型代码中的统一void 是C++ 中的一个重要习惯用法。令人惊讶的是有人觉得这很奇怪。

标签: c++ c++11 void default-constructor


【解决方案1】:

voidis an incomplete type。由于它是一个不完整的类型,表达式void{} 是非法的。

void() 但是在[expr.type.conv]/2 中被授予例外

[...] 如果类型是 cv void 并且初始化器 is (),表达式是指定类型的纯右值,不执行初始化。 [...]

这在通用代码中可能/有用。


上面有一个active issue,而current proposed wording for the C++20 draft

[...] 否则,如果类型是 cv void 并且初始化程序是 () 或 {}(在包扩展之后,如果有),则表达式是指定类型的纯右值,不执行初始化。 [...]

如果被接受,这将允许您执行return void{};

【讨论】:

  • 我真的很喜欢你回答的第二部分!
  • @einpoklum 很高兴你喜欢它。希望编译器会采用它并且编译器很快就会添加它。
  • 或者你可以说它不是 [dcl.init.list] 中所有语言使用的对象。此外,如果缺陷没有被接受,那么我们必须等待“Regular Void”
  • @ShafikYaghmour:我刚刚在question you linked to 前面添加了一个答案,解释了我为什么反对regular void(至少问题的呈现方式是这样)。
猜你喜欢
  • 2014-01-08
  • 2017-01-31
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
相关资源
最近更新 更多