【问题标题】:What's the difference between void() and void{}?void() 和 void{} 有什么区别?
【发布时间】:2013-09-22 21:33:04
【问题描述】:

基本上,我想知道为什么编译器会拒绝ptr2 声明:

int main() {
    // this one works
    decltype(void())* ptr1;

    // this one does not
    decltype(void{})* ptr2;
}

如果您认为ptr1 是函数指针,请查看this code

#include <iostream>
using namespace std;

template <class T>
void f(T t) {
    cout << __PRETTY_FUNCTION__ << endl;
}

int main() {
    decltype(void())* ptr;
    f(ptr);
}

输出是void f(T) [with T = void*]

【问题讨论】:

  • void{} 应该是什么?
  • @chris 和void() 一样,不管是什么。
  • “这个有效” ...“这个无效”——看起来就是这样。
  • @KeithThompson 但是为什么有任何区别呢?
  • @jeffamaphone 为什么要删除c++ 标签?我的意思是,c++11 仍然是c++,对吧?..

标签: c++ c++11


【解决方案1】:

[expr.type.conv]

2 表达式T(),其中T 是非数组完整对象类型的simple-type-specifiertypename-specifier 或(可能 cv-qualified) void 类型,创建指定类型的纯右值,其值是通过值初始化 (8.5) 类型 T 的对象产生的值; void() 的情况没有进行初始化。 [...]

注意void 一个简单类型说明符

3 类似地,simple-type-specifiertypename-specifier 后跟 braced-init-list 创建一个临时对象具有指定 braced-init-list 的指定类型 direct-list-initialized (8.5.4),其值是作为纯右值的临时对象。

感谢Keith Thompson 指出临时对象是在/3中创建的,而是在/2中创建的。

当我们查看 [basic.types]/5

未完全定义的对象类型和void 类型是不完整的类型 (3.9.1)。对象不应被定义为具有不完整的类型。

现在很明显,void{} 是不允许的,因为它会创建一个(临时)对象。 void() 但是“仅”创建一个 (pr) 值。我认为这两种情况的实现(行为)没有区别,但不同的语言规则适用于它们。其中一条规则禁止创建 void 类型的对象,因此会出现错误。


广告decltype(void())decltype(e) 采用表达式e。在[dcl.type.simple]/4中,decltype(e)的适用定义为:

否则,decltype(e)e 的类型

(因为void() 产生一个纯右值并且不是一个id-expression)。

因此,decltype(void()) 产生 void

【讨论】:

  • 我不知道 void() 有什么用处(它不是 C 语言的产物,因为那里不允许进行函数式转换)。
  • 我只是想在 SFINAE 中使用带有 decltype(&amp;T::f, void()) 的尾随返回类型,而不是 enable_if 和一些 has_f 构造。它对我来说看起来更好......
  • void{} 将创建一个void 类型的临时对象。没有 void 类型的对象,无论是临时的还是其他的。
  • 我想另一个原因是当T 变为void 时,在类模板中简单地允许T f() { return T(); }(另一个类似的情况是当T 变为标量类型时允许-&gt;~T();int)。我希望他们为T{} 做同样的事情,但显然不是。
  • .. 确实,这已经在 std-discussion groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/… 上提出,但我在 wg21 列表中找不到此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2017-12-05
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2017-05-02
相关资源
最近更新 更多