灵感来自 this question .假设我有一个带有默认构造函数的 class Lock
并且在一些代码中我写了以下语句:
Lock();
这将产生创建一个 class Lock
的临时对象并立即销毁它的效果。当然,创建可能有一些副作用,会改变程序的行为,但这看起来很奇怪.
所以我的第一个猜测是,从语言的角度来看,这些陈述虽然完全有效,但很可能包含逻辑错误。
上述语句有一些有效的用例吗?是否有一些著名和流行的成语包含这样的陈述?为什么我要在正确的程序中使用这样的语句?
最佳答案
它看起来并不比调用名为 Lock
的 void 函数更奇怪。
并不是说我建议您将函数视为只是命名有趣的构造函数(无论它们的返回类型是什么),但语法是有意相似的。
我暂时想不出创建但不使用 Lock
的充分理由,但是:
LockSession(lock);
具有与您期望的相同的副作用:
acquire_and_then_immediately_release(lock);
正如您所说,这很少是您想要的,因此对于不经意的读者来说,它可能看起来像是一个错误。如果出于某种奇怪的原因它是您想要的,并且您想避免混淆人们,您可以这样做:
{
LockSession session(lock);
// release immediately
}
或者就此而言:
void acquire_and_then_immediately_release(Lock &lock) {
LockSession(lock);
}
无论这是否真的是您的意思,或者您是否犯了忘记提供姓名的常见错误,因此持有锁的时间比您应该持有的时间短。/p>
为什么要获取然后立即释放锁?可能是因为您(ab)将它用作一个稍微奇怪的信号量。例如,您可以创建一堆持有锁的线程,如果每个线程做的第一件事就是这样,那么在所有线程创建完成之前,它们都不会通过它(加上父级希望线程执行的任何其他操作)能够看到)并且父级释放锁。可能有更好的例子说明构造副作用很显着的对象。
抛开副作用,另一种可能性是,如果你想检查一个字符串是否是有效的 XML,你可以写:
xml::dom::Document(mystring);
期待无效数据的异常。同样,如果您调用一个命名良好的函数来执行此操作,则代码将更具可读性。并且构造 DOM 树并不是验证 XML 的最有效方式。但是,如果您已经拥有一个类,那么使用它是最简单的方法。
我认为问题在于类的名称很少描述创建和销毁它的副作用。因此,由于这个原因,一个孤独的临时 union 显得很奇怪。
关于c++ - 是否有一个有效的案例来创建一个立即销毁且不直接在 C++ 中使用的临时对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518664/