C++ 指向函数中常量的智能指针';签名

C++ 指向函数中常量的智能指针';签名,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

我想知道,当我将一个shared_ptr作为参数传递给一个接受shared_ptr的函数时,隐式转换是否涉及一些隐藏成本(例如构造一个额外副本)

更让我惊讶的是,这一点:

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 !