如何用rvalue初始化std :: auto_ptr?

时间:2016-06-17 15:37:53

标签: c++ copy-constructor c++03 c++98 auto-ptr

#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(返回值优化)。

1 个答案:

答案 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可以隐式转换为此类型并可从此类型分配 。允许实现为模板提供不同的名称或以其他方式实现等效功能。

(强调补充)