2012-02-19 72 views
-1

不C++标准的保证,这里将是从功能的值返回auto_ptr的有效载荷时不崩溃:在C++中的值返回auto_ptr的有效载荷从功能

class Foo { ... }; 

std::auto_ptr<Foo> createFoo() { 
    return std::auto_ptr<Foo>(new Foo(...)); 
} 
... 
Foo getFoo() { 
    std::auto_ptr<Foo> foo(createFoo()); 
    return *foo; /// would be here a crash? 
} 

/// main 
const Foo& foo(getFoo()); 

什么相应会在这里的标准:*foo被复制,然后foo被销毁,最后return被执行?或者还有另一个步骤顺序?

我用GCC测试了这个例子,没有崩溃,但我不确定它是否会与其他编译器一起工作。

+1

有没有其他的命令不会中断**所有**的C++? – 2012-02-19 06:44:10

+0

这很好,但auto_ptr已被弃用,所以你应该避免它。 – 2012-02-19 06:44:40

+0

@n.m:我没有得到你,请你把你的问题展开得更详细些? – barankin 2012-02-19 06:46:23

回答

1

这是非常奇怪的代码,但是,是的 - 它是有保证的。没有RVO或移动语义,所以它应该没问题。

2

由于getFoo按值返回,它创建(另一个)Foo对象的副本。之后,通过auto_ptr删除原始对象并不重要。

相反,使用auto_ptr奇怪的代码,然后创建一个副本。