c++ - 如何保证按值返回的对象只有一种构造?

标签 c++ raii

我正在尝试实现一个类,例如 Foo ,遵循RAII,该类的对象按值返回给客户端,即

class SomeClass {
public:
  class Foo {
    public:
      ~Foo() { /* follow raii */ }
    private:
      friend class SomeClass;
      Foo() { /* follow raii */ }
  };

  Foo getFoo() { return Foo(); }
};

我直接的问题是有没有办法确保只有一个 Foo 类型的对象调用 SomeClass::getFoo() 时构造?我认为大多数编译器都知道只需要构造一个对象,但我知道在大多数情况下不能保证这一点。我可以采取更好的方法吗?

我尝试返回 boost::shared_ptr<Foo>只需分配 Foo构造共享指针时使用对象,这效果很好。然而,它似乎并不理想,因为它需要堆分配并且导致接口(interface)不太干净。

谢谢!

澄清

Visual Studio 2005 编译器,因此我认为 R-val 引用和 C++11 相关功能不可用。

最佳答案

您已经采取了最好的方法。该拷贝(或者实际上是 C++11 中的移动)几乎肯定会被编译器删除。事实上,甚至从返回值到调用代码中某个对象的复制也可能被省略。所以这只会调用一个构造函数:

Foo foo = sc.getFoo();

允许忽略这两个拷贝(或移动)的规则是:

when a temporary class object that has not been bound to a reference (12.2) would be copied/moved to a class object with the same cv-unqualified type, the copy/move operation can be omitted by constructing the temporary object directly into the target of the omitted copy/move

关于c++ - 如何保证按值返回的对象只有一种构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799414/

相关文章:

C++从main()通过类函数传递指针

c++ - 如何将字符串转换为 IP 地址,反之亦然

c++ - 为什么在 RAII 可用时进行垃圾收集?

c++ - boost 或 C++0x 中的任何 RAII 模板

c++ - 如何使用 CGAL 简化组合映射

c++ - gcc 中的 basic_ofstream<unsigned char> 失败

c++ - 为 std::tuple 重载运算符 << - 可能的简化?

c++ - 是否有一种具有 RAII + Ref 计数的语言没有不安全的指针算术?

garbage-collection - 垃圾收集的副作用?

c++ - 是否存在 "finally"构造在 C++ 中有用的情况?