void() 和 void{} 有什么区别?
What's the difference between void() and void{}?
基本上,我想知道为什么编译器拒绝ptr2
声明:
int main() {
// this one works
decltype(void())* ptr1;
// this one does not
decltype(void{})* ptr2;
}
如果您认为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 表达式
T()
,其中T
是非数组完整对象类型或(可能符合 cv 的(void
类型的简单类型说明符或类型名说明符,创建指定类型的 prvalue,其值是通过值初始化 (8.5( 生成的类型T
的对象;对于void()
情况不进行初始化。[...]
:注: void
是一个简单的类型说明符。
3 类似地,简单类型说明符或类型名说明符后跟大括号的初始化列表使用指定的大括号初始化列表创建指定类型的直接列表初始化 (8.5.4( 的临时对象,其值是作为 prvalue 的临时对象。
感谢 Keith Thompson 指出临时对象是在/3 中创建的,而值是在/2 中创建的。
当我们看一下[基本类型]/5
未完全定义的对象类型和
void
类型是不完整的类型 (3.9.1(。对象不应定义为具有不完整的类型。
现在很明显,不允许void{}
,因为它会创建一个(临时(对象。 但是void()
"仅"会创建一个(pr(值。我认为这两种情况的实现(行为(没有区别,但不同的语言规则适用于它们。其中一个规则禁止创建类型为 void
的对象,因此出现错误。
广告decltype(void())
:decltype(e)
采用表达式e
。在 [dcl.type.simple]/4 中,decltype(e)
的适用定义是:
否则,
decltype(e)
是e
的类型
(因为void()
产生一个 prvalue 而不是 id 表达式(。
因此,decltype(void())
产生void
.
- 我应该使用什么来代替void作为变体中的替代类型之一
- 当我使用 void 函数的返回值(通过强制转换函数指针)时,究竟会发生什么?
- "Warning : No return statement in function returning non-void"是什么意思?
- C++ 此函数调用之前的(void)有什么作用?
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 在C++中将uint64_t转换为void类型的目的是什么
- 指针中的Void*有什么用
- 退货<void>是什么意思?
- 什么是 'R(*pf)(void*, Args..)',函数指向方法的指针?
- 代码行 1 中的"(void)"有什么用?
- "void function()"和"void *function()"有什么区别?
- (void *)1 是什么意思
- 什么是 qsort void*x 和 *(int*)x?
- 使用 static_cast() 的目的是什么<void>?
- "template<class C> void mini(C &a4, C b4) { a4 = min(a4, b4); }"定义的含义是什么?
- "conversion from void to non scalar type string"是什么意思?
- "void value not ignored as it ought to be" - 出了什么问题?
- "void()"有什么用?
- :void setData(const Color * & data_ptr)中的 *& 是什么意思;