为什么const为隐式转换?

Bra*_*ook 12 c++ constructor const rvalue implicit-conversion

在广泛阅读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);
}
Run Code Online (Sandbox Code Playgroud)



从第4节第3行开始

当且仅当声明T t = e时,表达式e可以隐式转换为类型T. 对于一些发明的临时变量t(8.5),其形式良好.某些语言结构要求将表达式转换为布尔值.在这样的上下文中出现的表达式e被称为在上下文中转换为bool并且当且仅当声明bool t(e)时才是格式良好的; 对于一些发明的临时变量t(8.5),其形式良好.隐式转换的效果与执行声明和初始化相同,然后使用临时变量作为转换的结果.如果T是左值引用类型(8.3.2),则结果是左值,否则为右值.当且仅当初始化将其用作左值时,表达式e用作左值.

接下来,我在8.5行6中找到了与用户定义类型相关的初始化器部分

如果程序要求对const限定类型T的对象进行默认初始化,则T应为具有用户提供的默认构造函数的类类型.

最后,我以12.3第2行结束了有关用户定义的转换的信息

用户定义的转换仅在明确无误的情况下应用(10.2,12.3.2).

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

  1. 有人可以了解const隐含转换的影响吗?
  2. 是否使用const12.3第2行使转换"明确"?
  3. 是否会const以某种方式影响第4节中谈到的左值与右值?

AnT*_*AnT 14

它与隐含的转换并没有多大关系.此外,它与转换并没有多大关系.这实际上是关于右值左值.

转换99为type时X,结果为rvalue.在C++中,转换结果总是rvalues(除非转换为引用类型).在C++中将非const引用附加到rvalues是非法的.

例如,此代码将无法编译

X& r = X(99); // ERROR
Run Code Online (Sandbox Code Playgroud)

因为它试图将非const引用附加到右值.另一方面,这段代码很好

const X& cr = X(99); // OK
Run Code Online (Sandbox Code Playgroud)

因为将一个const引用附加到右值是完全可以的.

您的代码中也会发生同样的事情.它涉及隐式转换的事实有点不合时宜.您可以使用显式转换替换隐式转换

implicit_conversion_func(X(99));
Run Code Online (Sandbox Code Playgroud)

并最终得到相同的情况:const它编译,没有const它没有.

同样,转换(显式或隐式)在此处扮演的唯一角色是它有助于我们生成一个rvalue.通常,您可以通过其他方式生成rvalue并遇到同样的问题

int &ir = 3 + 2; // ERROR
const int &cir = 3 + 2; // OK
Run Code Online (Sandbox Code Playgroud)