c++ - 是否有一个有效的案例来创建一个立即销毁且不直接在 C++ 中使用的临时对象?

标签 c++ design-patterns constructor declaration

灵感来自 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/

相关文章:

java - 根据同一方法的条件返回两种不同的数据类型

java - Android自定义arrayadapter构造函数问题

c++ - 除我的应用程序外全部静音

c++ - 设计模式 : inheritance and encapsulated inheritance

c++ - 我可以添加自定义#pragma 规则吗?

design-patterns - 将命令与其处理程序分离

c++ - 如何取消删除子类中的构造函数?

constructor - 如何使用工厂常量构造函数?

c++ - 为什么 PointerAlignment 选项不起作用?

c++ - 将零、负和正映射到 0、1、2 的无分支代码