【问题标题】:Process of conversion of types inside selection and iteration statements in C++C++中选择和迭代语句内的类型转换过程
【发布时间】:2021-11-17 18:05:00
【问题描述】:

根据 C++ ISO:

条件的值是一个初始化声明 switch 语句以外的语句是声明的值 变量根据上下文转换为 bool (7.3)。如果该转换是 格式不正确,程序格式不正确。条件的值 是 switch 语句中的初始化声明是值 声明的变量,如果它具有整数或枚举类型,或 该变量隐式转换为整数或枚举类型 否则。作为表达式的条件的值是 表达式,上下文转换为 bool 用于 switch 以外的语句;如果该转换格式不正确, 程序格式不正确。

以下引用来自上述第 7.3 节:

某些语言结构要求将表达式转换为 一个布尔值。表示出现在这种上下文中的表达式 e 被上下文转换为 bool 并且当且仅当 声明 bool t(e);是良好的,对于一些发明的临时 变量 t (9.4)。

基于这两个,我知道switch-statement 并不总是在具有适当类型的情况下进行转换。否则if-statement 看起来总是执行这样的转换,即使我做了类似if (true){} 的事情,我知道true 的值会被转换。那么,会发生这种情况吗?代码:if(true){} 会将 true 转换为布尔值?(即使 true 已经是布尔值)

【问题讨论】:

  • 任何值都可以转换成自己的类型。
  • 那么,bool true 被转换为 bool,?
  • 我不明白。 “if(true){} 会将true 转换为布尔值?” - 像true 这样的bool 需要什么样的转换才能变成bool
  • 你读的太多了。这只是“我们会在某些条件下使类型适合”的标准。
  • “出现在这种上下文中的表达式 e 据说在上下文中转换为 bool”(强调我的)。这并不是说 is 转换了,它是对标准短语“contextually converted”的解释。

标签: c++ if-statement switch-statement language-lawyer


【解决方案1】:

已经讨论过您误解了这两段的评论。我将重点介绍第二个。重要信息如下:

在某些情况下,值可能会隐式进行转换,即使转换实际上只能显式进行。

一些代码示例可能会有所帮助:

struct foo{
    explicit operator bool() {return true;}
};

int main()
{
   foo f;
   bool b(f);    // fine !
   bool c = f;   // error! no viable conversion from f to bool
                 // because foo::operator bool is explicit
}

foo 可以转换为bool,但转换运算符为explicit。因此bool b(f)(显式转换)可以,而bool c = f;(隐式转换)则不行。

现在,在某些情况下...

出现在这种上下文中的表达式 e 被认为是上下文转换为 bool 的,并且当且仅当声明 bool t(e);对于一些发明的临时变量 t (9.4) 是良构的。

这解释了一些特殊的转换情况。此类转换是隐式发生的,但恰好在显式转换格式正确时是格式正确的。

如果没有这种“上下文转换”,这将是一个编译器错误:

 foo f;
 if (f) {}

但是,因为f 可以根据上下文转换为bool,所以代码是可以的。如果没有这种用于上下文转换的特殊规则,则必须编写if (bool(f)),因为foo::operator boolexplicit

换句话说,该段落不是关于将bools 转换为bool,而是解释了在必要时应用的通常隐式/显式转换的异常。

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 1970-01-01
    • 2016-05-07
    • 2015-09-26
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多