gpt4 book ai didi

c++ - void() 和 int() 解析的区别

转载 作者:IT老高 更新时间:2023-10-28 23:20:48 26 4
gpt4 key购买 nike

阅读了最令人头疼的解析后,我做了一些实验,发现了这个程序。有两条非常相似的线。其中一个在 g++7 和 clang++-3.9 中都会产生警告,另一个则不会。

int main() {
void(); // no warning
int(); // warning: statement has no effect
}

在第二行中,一个默认构造的 int 类型的对象被创建并立即销毁,因此未被使用。但是第一行会发生什么?如果以同样的方式解析,应该是错误的,因为创建 void 类型的对象是非法的。另一方面,它看起来也不像函数声明。

最佳答案

解析没有区别。这两种情况都由 simple-type-specifier 覆盖,后跟可选的带括号的 expression-list

语义含义在C++17 (N4659) [expr.type.conv]/2中指定:

If the type is cv void and the initializer is () , the expression is a prvalue of the specified type that performs no initialization. Otherwise, the expression is a prvalue of the specified type whose result object is direct-initialized with the initializer.

这特别说明 void()void 类型的纯右值。

现在,我确定 void 类型的纯右值是非法的并不是有意,因为它很常见,例如(void)x; 或调用 void 函数!

但我找不到标准中的哪个地方说应该为 void prvalues 抑制临时实现。 [class.temporary]/2 似乎是说丢弃值表达式总是物化一个临时值;实现不完整类型的prvalue是错误的。也许是标准的缺陷。


关于“未使用值”的警告的不同可能是因为 void 类型的未使用值是常见的,并且警告没有帮助。

关于c++ - void() 和 int() 解析的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913009/

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