为什么shared_ptr有一个显式构造函数

5
我想知道为什么shared_ptr没有隐式构造函数。这里提到了它没有的事实:Getting a boost::shared_ptr for this (我已经理解了原因,但还是觉得这是一个有趣的问题。)
#include <boost/shared_ptr.hpp>
#include <iostream>

using namespace boost;
using namespace std;

void fun(shared_ptr<int> ptr) {
    cout << *ptr << endl;
}

int main() {
    int foo = 5;
    fun(&foo);
    return 0;
}

/* shared_ptr_test.cpp: In function `int main()':
 * shared_ptr_test.cpp:13: conversion from `int*' to non-scalar type `
 *  boost::shared_ptr<int>' requested */
5个回答

10
在这种情况下,shared_ptr会尝试释放你的栈内存分配的int。你不希望它这样做,因此显式构造函数存在是为了让你思考一下。

6

逻辑上的原因是:

  • 在C++中,调用delete操作符不是隐式的
  • 创建任何拥有智能指针shared_whatever, scoped_whatever等)实际上是对delete操作符的延迟调用

2

我是一名长期潜水者,也是一名三年级的软件工程学生。

我的猜测是,为了防止您试图将“自然”指针转换为shared_ptr,并在未通知shared_ptr的情况下解除指向的对象。

此外,还存在引用计数问题等其他问题。


-1
int main() {

    int foo = 5;
    fun(&foo);

    cout << foo << endl; // ops!!

    return 0;
}

1
我不认为它在本质上有什么不同,与 delete &foo; - curiousguy

-3

我认为在这个构造函数中没有必要使用explicit关键字。

提到使用偏移地址运算符(&)的不正确示例是毫无意义的,因为在现代C++中没有地方可以使用这样的运算符。除了在赋值/比较运算符中使用“this == &other”这样的习惯用法代码和一些测试代码之外。


operator& 给出的是一个左值的地址,而不是“偏移量”(无论这意味着什么)。 - curiousguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接