【问题标题】:GCC error: cannot convert 'const shared_ptr<...>' to 'bool' in returnGCC 错误:无法将 'const shared_ptr<...>' 转换为 'bool' 作为回报
【发布时间】:2011-09-28 07:59:16
【问题描述】:

我正在切换到 GCC 4.6.1,它开始抱怨在 GCC 4.4 和 MSVC10 上运行良好的代码。从这样的函数返回时,它似乎不想在shared_ptrbool 之间进行转换:

class Class { shared_ptr<Somewhere> pointer_; };

bool Class::Function () const
{
    return pointer_;
}

使用

return static_cast<bool> (pointer_);

一切正常。到底他妈发生了什么?这是--std=cpp0x

【问题讨论】:

  • 你为什么要这样做?
  • 检查指针是否已设置。

标签: c++ gcc c++11


【解决方案1】:

在 C++11 中,shared_ptr 有一个 explicit operator bool,这意味着不能将 shared_ptr 隐式转换为 bool

这是为了防止shared_ptr 可能在算术表达式和类似情况中意外转换的一些潜在陷阱。

添加显式转换是对代码的有效修复。

您也可以使用return pointer_.get() != 0;return pointer_.get(); 甚至return pointer_ != nullptr;

【讨论】:

  • @LucDanton:无缘无故,我完全不喜欢这种方法,但是是的,它也有效。
  • 老实说我提到它是因为它在显式转换运算符和上下文转换之前。
  • @LucDanton 如果你喜欢混淆,是的。你真正想写的是return pointer != NULL;return pointer.is_valid(); 或类似的东西。遗憾的是,Boost 和标准委员会都没有决定支持这一点,所以你坚持使用 return pointer.get() != NULL'
  • 抱歉拖了这么久。为什么不返回 pointer_.is_initialized() ?
【解决方案2】:

shared_ptr 有一个explicit bool conversion。它可以在条件表达式中使用,也可以像使用 static_cast 一样显式转换为 bool。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2017-08-06
    • 2020-01-23
    • 2023-03-24
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多