gpt4 book ai didi

c++ - 你能举个例子说明什么时候真的需要 auto_ptr_ref 吗?

转载 作者:太空狗 更新时间:2023-10-29 20:06:46 27 4
gpt4 key购买 nike

我想更好地理解创建库背后的机制和问题,我决定从 std::auto_ptr 开始。我熟悉语法和用法,但是我想了解实现细节。我已经实现了我的 auto_ptr 版本,它看起来像这样:

#ifndef _AUTO_PTR_H
#define _AUTO_PTR_H

namespace test
{
template<typename T>
class auto_ptr
{
public:
//ctor, dtor, copy ctor and assignment
explicit auto_ptr(T* ptr = 0) throw()
: ptr_(ptr) {}

auto_ptr(auto_ptr& other) throw()
:ptr_(other.release()) {}

auto_ptr<T>& operator=(auto_ptr<T>& other)
{
reset(other.release());
return *this;
}

template<typename U>
auto_ptr<T>& operator=(auto_ptr<U>& other) throw()
{
reset(other.release());
return *this;
}

template<typename U>
auto_ptr(auto_ptr<U>& other) throw()
: ptr_(other.release()) {}

//member
~auto_ptr() throw() { delete ptr_; }

T& operator*() const throw() { return *ptr_; }

T* operator->() const throw() { return ptr_; }

T* get() const throw() { return ptr_; }

T* release() throw()
{
T* temp = ptr_;
ptr_ = 0;
return temp;
}

void reset(T* ptr = 0) throw()
{
if (ptr_ != ptr)
{
delete ptr_;
ptr_ = ptr;
}
}

private:
T* ptr_;
};
}

#endif

我的类(class)完成了大部分工作,然后我阅读了 this question很明显为什么要使用 auto_ptr_ref。但是,我想举一个实际的例子,当 auto_ptr 在不添加 auto_ptr_ref 的情况下表现不同时。

我的实现可以正确使用此函数:

template <typename T>
test::auto_ptr<T> source()
{
return test::auto_ptr<T>(new T());
}

template <typename T>
void sink(test::auto_ptr<T> bye)
{
}

template <typename T>
void useButNotSink(const test::auto_ptr<T> seeYouLater)
{
std::cout << *seeYouLater << std::endl;
}

有了这个测试程序:

test::auto_ptr<double> copyConstructed(source<double>());

std::cout << *copyConstructed << std::endl;
std::cout << copyConstructed.get() << std::endl;

test::auto_ptr<double> assigned(new double(10));
assigned = source<double>();

std::cout << *assigned << std::endl;
std::cout << assigned.get() << std::endl;
*assigned = 2044;

std::cout << *assigned << std::endl;
useButNotSink(assigned);
sink(assigned);
std::cout << assigned.get() << std::endl;

我确定我遗漏了一些东西,你能给我一个例子,其中 auto_ptr_ref 结构和转换运算符是强制性的以获得正确的行为吗?

谢谢

最佳答案

你的第一行

test::auto_ptr<double> copyConstructed(source<double>());

已经不能被任何符合标准的编译器编译。当启用 C++ 语言扩展时,MSVC 将允许它。禁用扩展,您将立即意识到需要 auto_ptr_ref

auto_ptr_ref 背后的机制对于 MSVC 6.0 来说太复杂了,因此为了支持完整的 std::auto_ptr 功能,编译器必须依赖这个编译器扩展,即允许将非常量引用绑定(bind)到临时对象。该问题已在更高版本的编译器中修复,但此编译器扩展至今仍默认启用。

关于c++ - 你能举个例子说明什么时候真的需要 auto_ptr_ref 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6266014/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com