在大量阅读之后 ISO/IEC 14882,编程语言 - C ++ 我仍然不确定为什么 const 隐式转换为具有单个参数构造函数的用户定义类型所需的需要如下

#include <iostream>

class X {
public:
   X( int value ) {
      printf("constructor initialized with %i",value);
   }
}

void implicit_conversion_func( const X& value ) {
   //produces "constructor initialized with 99"
}

int main (int argc, char * const argv[]) {
   implicit_conversion_func(99);
}



从第4节第3行开始

当且仅当声明t t = e时,表达式E可以隐式转换为T型t。对于某些发明的临时变量t(8.5),形成良好。某些语言构造需要将表达式转换为布尔值。在这种情况下出现的表达e被认为是上下文转换为bool的,并且仅当声明bool t(e)时才能很好地转换为bool;对于某些发明的临时变量t(8.5),形成良好。任何一个隐式转换的效果与执行声明和初始化,然后使用转换结果使用临时变量。结果是LVALUE,如果T是LVALUE参考类型(8.3.2),则否则为rvalue。当且仅当初始化将其用作LVALUE时,表达式E被用作LVALUE。

之后,我发现了与用户定义类型相关的初始化部分,在8.5行6中

如果程序要求使用const配合的T型T型对象的默认初始化,则应是具有用户提供的默认构造器的类类型。

最终,我最终在第2行2行,内容涉及用户定义的转换

用户定义的转换仅在明确的情况下应用于它们(10.2,12.3.2)。

不用说,10.2和12.3.2没有回答我的问题。

  1. 有人可以阐明什么效果 const 有隐性转换吗?
  2. 使用 const 每12.3行2将转换“明确”?
  3. const 以某种方式影响了LVALUE与RVALUE在第4节中谈论的?
有帮助吗?

解决方案

它与转换无关 隐式. 。而且,它与 转换. 。真的是关于 rvalues VS. lvalues.

当您转换时 99 输入 X, ,结果是 rvalue. 。在C ++中,转换的结果始终是RVALUE(除非您转换为参考类型)。在C ++中,将非const引用附加到RVALUS中是非法的。

例如,此代码不会编译

X& r = X(99); // ERROR

因为它试图将非企业引用附加到rvalue。另一方面,此代码很好

const X& cr = X(99); // OK

因为将const引用连接到rvalue是完全可以的。

代码也发生了同样的事情。它涉及隐式转换的事实在重点旁边。您可以用明确的一个替换隐式转换

implicit_conversion_func(X(99));

最终以同样的情况: const 它编译,没有 const 不是。

同样,转换(明确或隐式)扮演的唯一角色是它可以帮助我们产生rvalue。通常,您可以以其他方式生产一个rvalue并遇到同一问题

int &ir = 3 + 2; // ERROR
const int &cir = 3 + 2; // OK

其他提示

根据第5.2.2节第5段,当函数的论点是 const 参考类型,如果需要,将自动引入临时变量。在您的示例中,rvalue的结果 X(99) 必须放入临时变量,以便可以通过 const 引用 implicit_conversion_func.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top