我一直在看一个Qt 教程,它使用了我以前没见过的结构:
(void) new QShortcut(Qt::Key_Enter, this, SLOT(fire()));
(void) new QShortcut(Qt::Key_Return, this, SLOT(fire()));
(void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));
Run Code Online (Sandbox Code Playgroud)
我已经尝试了这个没有(void)它仍然编译和工作,所以这是什么目的(void)?
Fai*_*ali 21
将表达式转换为(void)基本上告诉编译器忽略该表达式的结果(在计算之后).
在您的示例中,每个表达式(每个语句/行)都是通过new运算符动态分配内存 - 并且由于new将指针(地址)返回到内存,通常的做法是将该指针存储在您可以使用的变量中用于最终删除对象并释放内存.在您的示例中,由于指针被丢弃,显式强制转换为(void)使程序员的意图明确:"我确切地知道我在做什么 - 请丢弃新返回的值"
如果您对技术问题感兴趣(引用C++标准,第5条):
任何表达式都可以显式转换为cv void类型.表达式值被丢弃.[注意:但是,如果值在临时变量(12.2)中,则该变量的析构函数在正常时间之前不会执行,并且为了执行析构函数而保留变量的值.-end note]
左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换不应用于表达式.
如果你想知道这些对象是如何被删除的(如果它们确实被删除了),答案是QShortcut的构造函数中的'this'指针应该与new返回的值相同,并且可以传递到一个ShortcutManager.注意,构造函数中的'this'与传递给QShortcut的构造函数的'this'指针不同.
如果你丢弃像这样的函数的返回值,一些C++编译器会发出警告.在这种情况下,代码看起来像是泄漏内存,因此您会收到警告.该(void)告诉编译器不会发出警告:"把这个功能,虽然它返回void".