首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当将对象转换为bool时,显式说明符似乎不起作用

当将对象转换为bool时,显式说明符似乎不起作用
EN

Stack Overflow用户
提问于 2019-01-29 15:31:38
回答 2查看 771关注 0票数 13

我最近正在学习C++,我注意到了一个关于cp偏好的示例,它的一部分是这样的:

代码语言:javascript
复制
struct B
{
    explicit B(int) { }
    explicit operator bool() const { return true; }
};

int main()
{
    B b2(2);       // OK: direct-initialization selects B::B(int)
    if (b2) ;      // OK: B::operator bool()
}

隐式转换的介绍告诉我,“当表达式在if语句或循环中使用时”,该表达式( b2 )的结果将隐式转换为bool类型。

此外,显式说明符的介绍告诉我,如果“转换函数是显式的,它不能用于隐式转换”。

既然b2将在if(b2)中隐式转换,而转换函数是explicit,那么if(b2)怎么会正常呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-29 15:35:14

语境转换是特殊的;由于C++11,在上下文转换中将考虑explicit转换函数。

(强调地雷)

(自C++11以来) 在以下上下文中,如果声明bool t(e); 格式良好(即显式转换函数,如显式T::operator bool() const;被认为是),则需要bool类型,并执行隐式转换。这样的表达式e被称为上下文转换为bool。

  • if,while,for的控制表达式;
  • 内建逻辑运算符的操作数!&和\x;
  • 条件运算符的第一个操作数?:;
  • static_assert声明中的谓词;
  • 除说明符外,非指定词中的表达式;
  • 显式说明符中的表达式;(自C++20起)
  • 契约属性的谓词。(自C++20以来)

这意味着对于if (b2)b2将被B::operator bool()隐式转换为bool,即使它被声明为explicit

票数 15
EN

Stack Overflow用户

发布于 2019-01-29 15:35:46

在你自己的链接中。即使对于explicit转换,上下文转换也是隐式发生的:

语境转换 在以下上下文中,如果声明bool;格式良好(即考虑explicit T::operator bool() const;之类的显式转换函数),则需要类型bool t(e);并执行隐式转换。这样的表达式e据说在上下文上被转换为bool

  • 控制ifwhilefor的表达;
  • 内置逻辑运算符!&&||的操作数;
  • 条件算子?:的第一个操作数;
  • static_assert声明中的谓词;
  • noexcept说明符中的表达式;
  • explicit说明符中的表达式;
  • 契约属性的谓词。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54424445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档