我一直在看一个Qt tutorial,它使用了一种我以前没有见过的结构:
(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()));我已经在没有(void)的情况下尝试过了,它仍然可以编译和工作,那么(void)的用途是什么呢
发布于 2009-06-22 22:38:44
将表达式转换为(void)基本上是告诉编译器忽略该表达式的结果(在计算它之后)。
在您的示例中,每个表达式(每个语句/行)都通过new运算符动态分配内存-由于new返回一个指向内存的指针(地址),因此通常的做法是将该指针存储在一个变量中,您可以使用该变量最终删除对象并释放内存。在您的示例中,由于指针被丢弃,显式转换为(void)使程序员的意图变得清晰:“我确切地知道我在做什么--请丢弃new返回的值。”
如果您对技术细节感兴趣(引用C++标准,第5条):
任何表达式都可以显式转换为cv void类型。该表达式值将被丢弃。注意:但是,如果值在临时变量(12.2)中,则该变量的析构函数直到正常时间才会执行,并且该变量的值将被保留以用于执行析构函数。-end笔记
左值到右值(4.1)、数组到指针(4.2)和函数到指针(4.3)标准转换不适用于表达式。
如果你想知道这些对象是如何被删除的(如果它们确实被删除了),答案是QShortcut的构造函数中的'this‘指针应该与new返回的值相同,并且可以传递给ShortcutManager。请注意,构造函数中的“this”与传递给QShortcut的构造函数的“this”指针不同。
发布于 2009-06-22 22:38:29
如果您丢弃这样的函数的返回值,一些C++编译器会给出警告。在这种情况下,代码看起来像是泄漏了内存,所以您会得到一个警告。(void)告诉编译器不要发出警告:“将此函数视为返回了void”。
发布于 2009-06-22 22:40:09
我认为从new语句返回的引用没有分配给指针。我看到this被传递了,所以QT必须对这个引用做些什么。
https://stackoverflow.com/questions/1029743
复制相似问题