C ++ 11:智能指针和输入参数 - 引用还是指针?

时间:2016-02-05 08:23:07

标签: c++ c++11

我正在使用C ++ 11中的新智能指针。我现在很困惑,这是将函数传递给函数的最佳方式。

方法/功能签名的标准规则是

  

输入:首选const引用和指针(f.e.nullptr是合法输入)

     

输出:应该是指针。

但是使用智能指针时,事情会变得更复杂,而且#34;。

我知道你不应该把输入传递给......

  • unique_ptr ,不转让所有权
  • shared_ptr 其中对象不应共享所有权。

...而是使用referece或pointer。

对我来说,标准规则的问题是使用该函数的开发人员必须从智能指针取消引用指针,并且他应该始终检查结果是否不是nullptr,因此总是"总是& #34;手动检查代码。

void foo(const MyClass& obj)
{
    ...
}

void main()
{
    auto a = make_unique<MyClass>();
    if(*a) // always check dereference
    {
        foo(*a);
    }
}

相反,将输入作为const指针传递,可用性更容易,但nullptr将是&#34;合法的&#34;值。

void foo(const MyClass* obj)
{
    ...
}

void main()
{
    auto a = make_unique<MyClass>();
    foo(a.get()); //easier to use, but nullptr is a "legal" value
}

当你使用指针时,任何人都可以分享他的意见,参考时以及在这种情况下你如何处理deref?

提前致谢

1 个答案:

答案 0 :(得分:1)

如果您正在尝试检查指针是否指向已分配的对象,或者它是否为null,请使用std::unique_ptr::operator bool,如果指针有效则返回true;如果尚未创建对象,则返回false:< / p>

http://en.cppreference.com/w/cpp/memory/unique_ptr/operator_bool

这比使用get()更好,更简单。

通常,对于unique_ptr,您不会将智能指针本身传递给任何函数,但是当您想要传递真实指针时,您会传递get()的返回值,这是一个非拥有者非拥有函数可以使用的普通指针。指针仍然由拥有的智能指针管理。常见的C ++指南鼓励仅将普通指针用于非拥有函数或从其他地方的智能指针接收此指针的类。