在广泛阅读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 (8.5) 是良构的。某些语言结构要求将表达式转换为布尔值。出现在这种上下文中的表达式 e 被称为在上下文中转换为 bool 并且当且仅当声明 bool t(e); 对于一些发明的临时变量 t (8.5) 是良构的。任一隐式转换的效果与执行声明和初始化然后使用临时变量作为转换的结果相同。如果 T 是左值引用类型 (8.3.2),则结果为左值,否则为右值。当且仅当初始化将表达式 e 用作左值时,表达式 e 才用作左值。
之后,我在 8.5 第 6 行中找到了与用户定义类型相关的初始化程序部分
如果程序要求对 const 限定类型 T 的对象进行默认初始化,则 T 应是具有用户提供的默认构造函数的类类型。
最后,我在 12.3 第 2 行结束了关于用户定义的转换,其中指出
用户定义的转换仅适用于明确的情况(10.2、12.3.2)。
不用说,10.2 和 12.3.2 没有回答我的问题。
- 有人可以阐明
const
对隐式转换有什么影响吗? - 使用
const
12.3 第 2 行的转换是否“明确”? - 是否会
const
以某种方式影响第 4 节中讨论的左值与右值?