我想知道为什么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 */
答案 0 :(得分:8)
在这种情况下,shared_ptr会尝试释放已分配int的堆栈。你不会想要那个,所以显式构造函数会让你考虑它。
答案 1 :(得分:5)
合乎逻辑的原因是:
delete
运算符并非隐含在C ++ shared_
无论如何,scoped_
无论如何,......)实际上是{{延迟)调用{{ 1}}运算符 答案 2 :(得分:2)
很长一段时间潜伏着,还有一名三年级的软英国学生, Haphazard猜测是,阻止你尝试将'自然'指针转换为shared_ptr,然后释放指向的对象,而不让shared_ptr知道dealloc。
(另外,引用计数问题等等)。
答案 3 :(得分:-1)
int main() {
int foo = 5;
fun(&foo);
cout << foo << endl; // ops!!
return 0;
}
答案 4 :(得分:-3)
我认为没有理由在这个构造函数中使用。
提到错误使用偏移地址运算符(&amp;)的例子毫无意义,因为在现代C ++中没有地方使用这样的运算符。除了在赋值/比较运算符中的这种惯用代码,除了'this ==&amp; other',也许还有一些测试代码。