我正在尝试实现一个类,例如 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/