用户定义和标准转换

时间:2014-05-12 13:15:53

标签: c++ type-conversion

为什么以下代码没有编译?

#include <iostream>
using namespace std;

struct CL1{};

struct CL2:CL1
{
    CL2(int){cout<<"int";}
};

void fnc(const CL1&)
{
}

int main()
{
    fnc(5);
    return 0;
}

两次转换是否有效?

  1. 用户定义的转化intCL2
  2. 标准转换派生到基地(CL2const CL1&
  3. 标准(2003)说:

      

    用户定义的转换序列包括初始标准转换序列,然后是用户定义的转换(12.3),后跟第二个标准转换序列。

    为什么这不起作用?

1 个答案:

答案 0 :(得分:2)

没有涉及引用的标准转换,因此该规则在此处不相关。相反,我们需要初始化引用的规则,在C ++ 11 8.5.3中给出。这些都很复杂;这里的相关内容是第5条的最后一个子弹(对于初始化者不能与参考类型进行参考兼容的情况):

  

创建一个cv1 T1类型的临时表,并从初始化表达式初始化   使用非参考拷贝初始化的规则

此处cv1 T1const CL1。无法从T1创建临时int,因此初始化失败。编译器不需要搜索从引用类型派生或可转换为引用类型的所有类型;它只考虑引用类型本身。您必须指定要创建CL2

func(CL2(5));

const CL1引用兼容,可用于初始化引用。

注意:我引用了C ++ 11,因为它已成为多年来的标准。规则和章节编号在C ++ 03(实际上是C ++ 98)中基本相同。