在广泛阅读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没有回答我的问题。
const
对隐式转化的影响吗?const
是否使转换“明确”?const
是否会以某种方式影响第4节中谈到的左值与右值?答案 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
。