2014-07-13 87 views
1

我有一个C++函数,它的参数是这样的:转换(隐含的)升压shared_ptr的<T>到shared_ptr <const T>

void myFunction(shared_ptr<const MyObject> ptr)) { 
    ... 
} 

,并在我的主代码我做这样的事情,并将其编译:

shared_ptr<MyObject> test(new MyObject()); 
myFunction(test); 

这是否意味着在MyFunction中,如果我解引用ptr,那么该对象是不变的,不能被修改?

正在进行什么样的转换才能编译?

+2

[有一个构造函数](http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr) – chris

回答

0

代码编译,因为是需要一个shared_ptr<MyObject>(约瑟夫·曼斯菲尔德的回答所示),因为const MyObject可以没有问题地绑定到MyObjectshared_ptr<const MyObject>构造函数(见What is a converting constructor in C++ ? What is it for?MSDN)。实际上,如果您尝试修改myFunctionptr指向的值,那么您将收到编译错误,指出您正在尝试修改常量对象。

+3

当你传递'shared_ptr'时,它如何从一个原始指针构造? – chris

+0

对不起,它不会。我刚刚看到你正在传递一个shared_ptr,进行了编辑。 – DrewBarbs

1

它使用的std::shared_ptr下面的构造:

template<class Y> shared_ptr(const shared_ptr<Y>& r) noexcept; 

其定义为“不参与重载决议,除非Y*是隐式 转换为T*”。因为,在你的例子中,T*可以隐式转换为const T*,一切都很好。这当然很好,因为这意味着shared_ptr的行为就像原始指针一样。

相关问题