gpt4 book ai didi

c++ - void() 和 void{} 有什么区别?

转载 作者:可可西里 更新时间:2023-11-01 16:36:24 27 4
gpt4 key购买 nike

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

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

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

看看this code如果你认为 ptr1 是一个函数指针:

#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*]

最佳答案

[expr.type.conv]

2 The expression T(), where T is a simple-type-specifier or typename-specifier for a non-array complete object type or the (possibly cv-qualified) void type, creates a prvalue of the specified type, whose value is that produced by value-initializing (8.5) an object of type T; no initialization is done for the void() case. [...]

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

3 Similarly, a simple-type-specifier or typename-specifier followed by a braced-init-list creates a temporary object of the specified type direct-list-initialized (8.5.4) with the specified braced-init-list, and its value is that temporary object as a prvalue.

感谢Keith Thompson指出在/3 中创建了一个临时对象,而在/2 中创建了一个

当我们看一下 [basic.types]/5

Incompletely-defined object types and the void types are incomplete types (3.9.1). Objects shall not be defined to have an incomplete type.

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


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

otherwise, decltype(e) is the type of e

(因为 void() 产生纯右值而不是 id 表达式)。

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

关于c++ - void() 和 void{} 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948966/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com