簡體   English   中英

用戶定義和標准轉換

[英]User-defined and standard conversions

為什么下面的代碼沒有編譯?

#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&

標准(2003)說:

用戶定義的轉換序列包括初始標准轉換序列,后跟用戶定義的轉換(12.3),然后是第二個標准轉換序列。

為什么這不起作用?

沒有涉及引用的標准轉換,因此此規則不相關。 相反,我們需要初始化引用的規則,在C ++ 11 8.5.3中給出。 這些都很復雜; 這里的相關內容是第5條的最后一個內容(對於初始化者與引用類型不是引用兼容的情況):

使用非引用復制初始化的規則從初始化表達式創建並初始化類型為cv1 T1的臨時類型

這里, cv1 T1const CL1 無法從int創建臨時T1 ,因此初始化失敗。 編譯器不需要搜索從引用類型派生或可轉換為引用類型的所有類型; 它只考慮引用類型本身。 您必須指定要創建CL2

func(CL2(5));

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

注意:我引用的是C ++ 11,因為這是幾年來的標准。 規則和章節編號在C ++ 03(實際上是C ++ 98)中基本相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM