我一直在看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)
的用途是什么?
答案 0 :(得分:21)
将表达式转换为(void)基本上告诉编译器忽略该表达式的结果(在计算之后)。
在您的示例中,每个表达式(每个语句/行)都是通过new运算符动态分配内存 - 并且由于new将指针(地址)返回到内存,通常的做法是将该指针存储在变量中您可以使用最终删除对象并释放内存。在你的例子中,由于指针被丢弃,显式转换为(void)使程序员的意图明确:“我确切地知道我在做什么 - 请丢弃新返回的值”
如果您对技术问题感兴趣(引用C ++标准,第5条):
任何表达式都可以显式转换为cv void类型。表达式值被丢弃。 [注意:但是,如果值在临时变量(12.2)中,则该变量的析构函数在正常时间之前不会执行,并且为了执行析构函数而保留变量的值。 - 注意事项]
左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换不适用于表达式。
如果你想知道这些对象是如何被删除的(如果它们确实被删除了),答案是QShortcut的构造函数中的'this'指针应该与new返回的相同,并且可以传递给ShortcutManager。注意,构造函数中的'this'与传递给QShortcut的构造函数的'this'指针不同。
答案 1 :(得分:7)
如果你丢弃像这样的函数的返回值,一些C ++编译器会发出警告。在这种情况下,代码看起来像是泄漏内存,因此您会收到警告。 (void)
告诉编译器不要发出警告:“将此函数视为返回void
”。
答案 2 :(得分:0)
我认为从new
语句返回的引用未分配给指针。我看到this
正在传递,因此QT必须对该引用做一些事情。