为什么以下代码没有编译?
#include <iostream>
using namespace std;
struct CL1{};
struct CL2:CL1
{
CL2(int){cout<<"int";}
};
void fnc(const CL1&)
{
}
int main()
{
fnc(5);
return 0;
}
两次转换是否有效?
int
至CL2
CL2
到const CL1&
)标准(2003)说:
用户定义的转换序列包括初始标准转换序列,然后是用户定义的转换(12.3),后跟第二个标准转换序列。
为什么这不起作用?
答案 0 :(得分:2)
没有涉及引用的标准转换,因此该规则在此处不相关。相反,我们需要初始化引用的规则,在C ++ 11 8.5.3中给出。这些都很复杂;这里的相关内容是第5条的最后一个子弹(对于初始化者不能与参考类型进行参考兼容的情况):
创建一个
cv1 T1
类型的临时表,并从初始化表达式初始化 使用非参考拷贝初始化的规则
此处cv1 T1
为const CL1
。无法从T1
创建临时int
,因此初始化失败。编译器不需要搜索从引用类型派生或可转换为引用类型的所有类型;它只考虑引用类型本身。您必须指定要创建CL2
:
func(CL2(5));
与const CL1
引用兼容,可用于初始化引用。
注意:我引用了C ++ 11,因为它已成为多年来的标准。规则和章节编号在C ++ 03(实际上是C ++ 98)中基本相同。