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没有回答我的问题.
const隐含转换的影响吗?const12.3第2行使转换"明确"?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)
| 归档时间: |
|
| 查看次数: |
3075 次 |
| 最近记录: |