#include <iostream>
#include <string>
#include <memory>
#include <cstdlib>
std::string foo()
{
return std::string("yyyyyyyyyyyyy");
}
void bar(std::string& s)
{
std::cout << s << std::endl;
}
std::auto_ptr<std::string> foo1()
{
bool x = std::rand() % 2;
if (x) {
return std::auto_ptr<std::string>(new std::string("eeeeeeeeeeee"));
} else {
return std::auto_ptr<std::string>(new std::string("aaaaaaaaaaaaa"));
}
}
int main()
{
//bar(foo());
std::auto_ptr<std::string> a(foo1());
}
注释行:bar(foo())
没有编译,因为bar接受非const引用,foo
返回rvalue。但是std::auto_ptr
的第二行编译。 std::auto_ptr
的复制构造函数也接受非const引用。为什么然后它编译?我在std::rand()
中使用了foo1
来消除RVO(返回值优化)。
答案 0 :(得分:2)
这显然有效,因为使用了一个小技巧来释放构造std::auto_ptr
的内部指针。来自This Manual的案例4 :
template< class Y >
auto_ptr( auto_ptr_ref<Y> m );
4)使用由m引用的auto_ptr实例中保存的指针构造auto_ptr。 p.release()被调用为持有的auto_ptr p来获取对象的所有权。 auto_ptr_ref是一个实现定义的类型,它包含对auto_ptr的引用。 std :: auto_ptr可以隐式转换为此类型并可从此类型分配 。允许实现为模板提供不同的名称或以其他方式实现等效功能。
(强调补充)