C++ 指向函数中常量的智能指针';签名
我想知道,当我将一个shared_ptrC++ 指向函数中常量的智能指针';签名,c++,c++11,casting,const-correctness,C++,C++11,Casting,Const Correctness,我想知道,当我将一个shared_ptr作为参数传递给一个接受shared_ptr的函数时,隐式转换是否涉及一些隐藏成本(例如构造一个额外副本) 更让我惊讶的是,这一点: void f(const shared_ptr<const Widget>& ){} void f(const shared_ptr&){ 为什么传递值有效? 您的代码之所以有效,是因为: 将r值传递给需要非常量l值引用的函数没有多大意义。您将无法观察foo对bar返回的值所做的更改 通过smartpoi
void f(const shared_ptr<const Widget>& ){}
void f(const shared_ptr&){
为什么传递值有效?
您的代码之所以有效,是因为:
将r值传递给需要非常量l值引用的函数没有多大意义。您将无法观察foo
对bar
返回的值所做的更改
通过smartpointers@cpp核心指南
关于向函数传递智能指针,请注意,上有一些项。底线是:如果方法没有参与引用计数(可能是最常见的情况),那么不要传递smartpointer,而是传递原始指针 谢谢,我编辑了这个问题。什么是
T
?2.提供一个可编译的示例或至少一条错误消息。如果f
只关心在小部件的持续时间内使用小部件
,请传递常量小部件*
(或者常量小部件&
,如果您知道它是非空的)。只有当f
希望参与拥有小部件(即它将指针存储在某处)时,您才应该传递共享\u ptr
@Caleth让我们假设我无法更改f的签名。无论如何,我完全同意你的建议。可能值得一提的是,向函数传递智能指针被认为是一种气味,除非该函数拥有指针的所有权。这个想法是,您应该只传递一个活动(和原始)指针,指向只需要使用对象的方法。@Mgetz是的,值得一提;-)谢谢你这么做。嗨,用户463035818,我用另一个案例编辑了我的问题。我可以把它写在一个单独的问题中,但我认为最好把这些东西放在一起,因为它们是密切相关的。我希望您或一些慈善人士有时间编辑您关于“const&const”案例的回答。Thanks@jimifiki很抱歉,忽略我的评论(已删除)。我写得太快了;)。我的回答实际上已经解释了为什么你所添加的内容是有效的。将编辑该问题以进行更多解释。。。
void f(shared_ptr<const Widget>& ){}
void f(const shared_ptr<const Widget>& ){}
template< class Y >
shared_ptr( const shared_ptr<Y>& r ) noexcept;
void f(shared_ptr<const Widget>& ){}
int main(){
std::shared_ptr<Widget> p;
std::shared_ptr<const Widget> p2{p};
// f(p); // error: cannot bind non-const reference to temporary
f(p2); // OK
return 0;
}
void f(const shared_ptr<const Widget>& ){}
void foo(int& x) { x += 2; }
int bar() { return 3; }
int main() { foo(bar()); } // error !