12.16 对unique_ptr进行拷贝或赋值,程序会调用删除的函数,标准库为了禁止unique_ptr的拷贝和赋值,将其拷贝构造函数和赋值函数声明为delete的。
12.17 (a) 不合法。unique_ptr需要用指针初始化,int无法转换为指针;(b)合法;(c)合法;(d)合法;(e)合法;(f)合法
12.18 unique_ptr独占对象所有权,无法拷贝和赋值,需要用release操作从一个unique_ptr转移到另一个unique_ptr;shared_ptr共享对象所有权,支持拷贝和赋值,无需release操作。
12.19 将StrBlob和StrBlobPtr定义到头文件StrBlob.h中,代码如下
#ifndef STRBLOB_H
#define STRBLOB_H
#include <string>
#include <vector>
#include <memory>
#include <stdexcept>
using namespace std;
class StrBlobPtr;
class StrBlob {
friend class StrBlobPtr;
public:
typedef vector<string>::size_type size_type;
StrBlob();
StrBlob(initializer_list<string> il);
bool empty() const { return data->empty(); }
size_type size() const { return data->size(); }
void push_back(const string &s) { data->push_back(s); }
void pop_back();
string& front();
const string& front() const;
string& back();
const string& back() const;
StrBlobPtr begin();
StrBlobPtr end();
private:
shared_ptr<vector<string>> data;
void check(size_type i, const string &msg) const;
};
class StrBlobPtr {
friend bool eq(const StrBlobPtr &lhs, const StrBlobPtr &rhs);
public:
StrBlobPtr(): curr(0) { }
StrBlobPtr(StrBlob &a, size_t sz = 0):
wptr(a.data), curr(sz) { }
string& deref() const;