使用boost shared_ptr时使用默认参数

Using default parameters when using boost shared_ptr

本文关键字:默认 参数 ptr boost shared 使用      更新时间:2023-10-16

我有boost shared_ptr作为函数的参数,我希望这个参数有一些默认值。

void foo(boost::shared_ptr<myclass> ptr = nullptr);

因为ptr不是指针,而是一个类。。

那我该怎么办?

我发现了一个类似的问题:boost::shared_ptr和nullptr在默认模板函数参数中

但那里的解决方案只是切换到std::shared_ptr,但我做不到

感谢

由于您使用的是nullptr,您必须使用C++11,因此您应该能够做到这一点:

void foo(boost::shared_ptr<myclass> ptr = {});

这使得默认参数成为默认构造的shared_ptr,与用nullptr初始化的参数相同。它要求编译器支持统一的初始化语法,而不是要求Boost版本支持从nullptr_t构造shared_ptr

如果你的编译器不能处理这个问题,那么使用ForEveR的答案。

nullptr初始化boost::shared_ptr是完全可以的。它有一个特殊的构造函数:

#if !defined( BOOST_NO_CXX11_NULLPTR )
shared_ptr( boost::detail::sp_nullptr_t ) BOOST_NOEXCEPT : px( 0 ), pn() // never throws
{
}
#endif

boost::detail::sp_nullptr_t以可移植的方式解析为nullptr_t

为什么不简单?

void foo(boost::shared_ptr<myclass> ptr = boost::shared_ptr<myclass>());

我认为问题不在于"是否为类",而是所涉及的构造函数是显式的。你的形式需要隐含的转换。您可以使用一个明确的形式:boost::shared_ptr<myclass>(nullptr)boost::shared_ptr<myclass>(),以您的版本支持的形式为准。