Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 缺少唯一的\u ptr和friends运算符=重载_C++_C++11_Std - Fatal编程技术网

C++ 缺少唯一的\u ptr和friends运算符=重载

C++ 缺少唯一的\u ptr和friends运算符=重载,c++,c++11,std,C++,C++11,Std,我知道这类问题在这里并不受欢迎,但我必须问: 为什么unique\u ptr/shared\u ptr/etc没有一个运算符=类型t的重载 写作似乎更自然 std::unique_ptr<int> p = new int(5); std::unique_ptr p=newint(5); 而不是 std::unique_ptr<int> p(new int(5)); std::unique_ptr p(新int(5)); 或任何其他更详细的方法。如果允许您编写以下内

我知道这类问题在这里并不受欢迎,但我必须问: 为什么unique\u ptr/shared\u ptr/etc没有一个运算符=类型t的重载

写作似乎更自然

std::unique_ptr<int> p = new int(5);
std::unique_ptr p=newint(5);
而不是

std::unique_ptr<int> p(new int(5));
std::unique_ptr p(新int(5));

或任何其他更详细的方法。

如果允许您编写以下内容:

std::unique_ptr<int> p = new int(5);
std::unique_ptr p=newint(5);
那么你也可以写这些:

void Func1(std::unique_ptr<int> p);

Func1(new int(5));

std::unique_ptr<int> Func2() {return new int(5);}
void Func1(std::unique\u ptr p);
Func1(新整数(5));
std::unique_ptr Func2(){return new int(5);}
或者更危险的是:

void Func1(std::unique_ptr<int> p);

int *pInt = new int(5);
Func1(pInt); //You no longer own the pointer anymore.
delete pInt; //You're now deleting a pointer you don't own.
void Func1(std::unique\u ptr p);
整数*品脱=新整数(5);
功能1(品脱)//你不再拥有指针了。
删除品脱//您现在正在删除一个不属于您的指针。
这显然是不可接受的。他们不希望从裸指针隐式转换为唯一指针;如果要创建一个
unique_ptr
,必须明确说明:
Func1(std::unique_ptr(pInt))现在,每个人都可以看到您正在将所有权从自己转移到函数


而且,并不是一个
操作符=
可以使这项工作正常。是
unique\u ptr
的单参数构造函数上的
显式
停止了复制初始化语法的工作。

如果允许您编写以下内容:

std::unique_ptr<int> p = new int(5);
std::unique_ptr p=newint(5);
那么你也可以写这些:

void Func1(std::unique_ptr<int> p);

Func1(new int(5));

std::unique_ptr<int> Func2() {return new int(5);}
void Func1(std::unique\u ptr p);
Func1(新整数(5));
std::unique_ptr Func2(){return new int(5);}
或者更危险的是:

void Func1(std::unique_ptr<int> p);

int *pInt = new int(5);
Func1(pInt); //You no longer own the pointer anymore.
delete pInt; //You're now deleting a pointer you don't own.
void Func1(std::unique\u ptr p);
整数*品脱=新整数(5);
功能1(品脱)//你不再拥有指针了。
删除品脱//您现在正在删除一个不属于您的指针。
这显然是不可接受的。他们不希望从裸指针隐式转换为唯一指针;如果要创建一个
unique_ptr
,必须明确说明:
Func1(std::unique_ptr(pInt))现在,每个人都可以看到您正在将所有权从自己转移到函数


而且,并不是一个
操作符=
可以使这项工作正常。是
unique\u ptr
的单参数构造函数上的
explicit
阻止了复制初始化语法的工作。

您指的是
unique\u ptr
的构造函数采用原始
T
指针是显式的。这是故意的。唯一指针拥有所有权,这不应该隐式发生。用户应始终明确知道所有权的创建、转移和结束时间

在一个更加严酷的世界里,人们可以想象一个
独特的\u ptr
,它根本不接受任何原始指针,而是只允许直接创建所拥有的对象:

auto p = std::unique_ptr<T>::make(arg1, arg2, arg3);
                             // Calls "new T(arg1, arg2, arg3)".
                             // Not real code.
auto p=std::unique\u ptr::make(arg1、arg2、arg3);
//调用“新T(arg1、arg2、arg3)”。
//不是真正的代码。

您所指的是,接受原始
T
指针的
unique\u ptr
的构造函数是显式的。这是故意的。唯一指针拥有所有权,这不应该隐式发生。用户应始终明确知道所有权的创建、转移和结束时间

在一个更加严酷的世界里,人们可以想象一个
独特的\u ptr
,它根本不接受任何原始指针,而是只允许直接创建所拥有的对象:

auto p = std::unique_ptr<T>::make(arg1, arg2, arg3);
                             // Calls "new T(arg1, arg2, arg3)".
                             // Not real code.
auto p=std::unique\u ptr::make(arg1、arg2、arg3);
//调用“新T(arg1、arg2、arg3)”。
//不是真正的代码。

实际上我错了,您的第一个表单也没有编译;-)很抱歉(它正在调用构造函数,但看起来它无法创建一个临时对象来传递给复制构造函数。)我知道它不会编译,这是指针看起来像的副本--解释其基本原理是避免无意中分配指针(以及占用内存)。您可以通过创建显式临时对象并分配这些对象来解决此问题。分配运算符与您的代码完全无关。实际上我错了,您的第一个表单也没有编译;-)很抱歉(它正在调用构造函数,但看起来它无法创建一个临时对象来传递给复制构造函数。)我知道它不会编译,这是指针看起来像的副本--解释其基本原理是避免无意中分配指针(以及占用内存)。您可以通过创建显式临时对象并分配这些对象来解决此问题。分配运算符与您的代码完全无关。如果我们这样做,我们也不应该被允许这样做:int*p=new int(5);标准:唯一温度(p);删除p@user1233963:那么就没有办法将指针放入
唯一\u ptr
。我们的目标是确保您不会意外地这样做,而不会看到
unique\u ptr
坐在发生所有权转让的现场。由于C++的规则,这也意味着你不能使用复制初始化(AK:<代码> Type NealVa= ToS.<代码>),必须使用直接初始化(AK:<代码>类型名VAR(Toes);< /C> >)。如果我们这样做,我们也不应该允许这样做:int *P= new int(5);标准:唯一温度(p);删除p@user1233963:那么就没有办法将指针放入
唯一\u ptr
。我们的目标是确保您不会意外地这样做,而不会看到
unique\u ptr
坐在发生所有权转让的现场。由于C++的规则,这也意味着你不能使用拷贝初始化(AK:<代码> Type NealVa= ToS.<代码>),必须使用直接初始化(AK:<代码>类型名VAR(THOST);