为什么const为隐式转换?

时间:2010-10-09 03:58:13

标签: c++ constructor const implicit-conversion rvalue

在广泛阅读ISO/IEC 14882, Programming language – 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(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. {12}第2行使用const是否使转换“明确”?
  3. const是否会以某种方式影响第4节中谈到的左值与右值?

2 个答案:

答案 0 :(得分:14)

隐式的转换并没有多大关系。此外,它与转换并没有多大关系。它实际上是关于 rvalues lvalues

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

例如,此代码将无法编译

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

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

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

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

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

implicit_conversion_func(X(99));

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

同样,转换(显式或隐式)在这里扮演的唯一角色是它可以帮助我们生成一个右值。通常,您可以通过其他方式生成rvalue并遇到相同的问题

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

答案 1 :(得分:0)

根据5.2.2第5节,当函数的参数为​​const引用类型时,如果需要,将自动引入临时变量。在您的示例中,必须将X(99)的右值结果放入临时变量中,以便该const引用传递给implicit_conversion_func