为什么要进行隐式转换?
-
29-09-2019 - |
题
在大量阅读之后 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没有回答我的问题。
- 有人可以阐明什么效果
const
有隐性转换吗? - 使用
const
每12.3行2将转换“明确”? - 做
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
.