簡體   English   中英

C ++編譯器如何綜合默認副本構造函數

[英]C++ how does the compiler synthesize the default copy constructor

編譯器為未定義自己的類的類綜合的默認副本構造函數做正確的事情:它將所有成員從一個對象復制到另一個對象。

我想做類似的事情。 我想寫一個方法

template <typename T>
T f(const T& obj) {
 // for each member var i of obj, I want to call some method g(obj.i)
}

現在,我不知道成員變量的名稱是什么。 如果這是副本構造函數,則可以調用賦值運算符而不是g。

顯然,編譯器會執行此操作(但在推斷出類成員的名稱之后,可能會執行此操作)。 甚至有可能對任何T類都這樣做嗎?

編譯器具有一些表示每個類的內部數據結構。 在合成副本構造函數時,它可以引用此結構以弄清楚它需要發出什么代碼(多少個副本,每個副本如何完成,以及成員相對於源地址的地址是什么)和目標對象地址)。

作為純C ++程序員,您無權訪問此內部編譯時數據結構,因此您很不走運。 您基本上必須列出成員,並希望您不要遺漏任何成員。

也許你可以做的工作,預處理器(或者如果沒有處理器則處理器),標注與您可以用它來生成一個呼叫為每個成員的名單額外信息的結構定義。

不,你不能這樣做。 C ++沒有方法反射 ,盡管您可以通過在Qt之類的框架中進行操作來實現。 (雖然btw是一個很好的框架,但我一直使用它,並且它僅在C ++上提供一個紙薄的層。)編譯器也不需要這樣做-也就是說,它不需要推斷成員的姓名 它僅知道對象地址的內存偏移量和每個成員的類型,然后通過調用其構造函數將其復制到目標對象。

暫無
暫無

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

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