I don’t see a reason why these don’t have an assignment operator overload for plain old pointers of the type they’re templated to. If the goal of making smart pointers interface as close to plain old pointers as they could, then why didn’t they make an overload for the assignment operator like this?
inline std::shared_ptr<type> &operator=( const type * pointer)
{
reset(a);
}
this way you could use them just like you would a normal pointer, like so:
std::shared_ptr<int> test = new int;
it’s not an issue at all, just wondering why they went to the trouble of just overloading a couple of operators.
Also wondering if there’s a way to overload the global assignment operator to do this, or if there’s any reason i shouldn’t.
edit: adding a response to Nawaz about his answer here for code formatting. I just wrote this test program to see if what you were saying was right:
template<class T>
class peh
{
public:
peh() {meh = 3;}
const peh<T> & operator=(const int * peh)
{
}
};
void f( peh<int> teh)
{
}
int main()
{
int * meh = new int;
f(meh);
system("PAUSE");
return 0;
}
this here errors out saying there is no usable conversion from peh<int> to int *. so why is it acceptable with std::shared_ptr<int> to int *?
No. Assignment operator overload must a member function.
By the way, if you want the following functionality, then you should not talk about assignment operator, you should rather ask : why the constructor which takes raw pointer as argument is made
explicit? why it is not implicit?It is illegal, but suppose for a while that this was allowed, then you would be able to call the following function passing a raw pointer as argument : such a feature would be dangerous, as the rest of the answer explains (read the comments) :
Now see the dangerous part:
Please read the comments. It explains each part of the code snippet above.