[英]Why is it is impossible to overload return type in C++, but possible to overload parameters?
我想知道,C ++編譯器(或其他任何東西)中是否存在真正的技術限制,導致返回類型不能被重載,或者僅僅是在語言中插入了設計限制?
謝謝!
如果您要稱呼它為技術限制,則:
C ++類型是自下而上推斷的:表達式的類型僅取決於其子表達式,而與出現在其中的上下文表達式無關。因此,可以確定重載方法的參數類型,以便選擇要調用的版本,但是如果返回類型上有重載,就不可能分辨出要調用的方法。
示例:在e1 + f(e2, e3)
,可以在選擇f
的版本之前確定e2
和e3
的類型,然后才根據它們選擇f
的版本。 但是上下文不允許根據f
的返回類型選擇一個版本,實際上,可以接受幾種類型作為返回類型。
函數調用是一個表達式。 每個表達式都有一個上下文,該上下文會影響表達式的求值方式,但是此信息不會在函數重載解析中使用。
在函數重載解析期間,將函數調用的參數表達式與查找函數名稱時發現的一組函數的參數聲明進行比較。 通過極其復雜的排序算法,它選擇了最佳可行的函數,然后函數的返回類型給出了函數調用表達式的初始類型。 然后,將此返回類型與上下文進行比較,以確定是否需要轉換(如果需要,如果可能且明確),以調整返回類型以適合上下文。
但是,這些上下文不是簡單地由類型指定的。 每個上下文由標准中自己獨特的一組規則指定。 因此,基於它們進行重載解析將極其復雜。
考慮例如:
f(g(x))
在這里,我們正在對f
和g
執行重載解析。 假設每個函數有10個版本-並在重載解析中包含g(x)
的上下文。
g(x)
是f
的參數-因此上下文是“初始化10個不同函數的10個不同參數類型之一”。
x
是要與10 g
參數列表進行比較的參數。
因此,我們必須考慮f
和g
每種可能組合,總共需要100種組合。
很容易看出這種方案是如何成倍增長的。 現在考慮:
f(g(h(p(x))))
這就是為什么在C ++函數中,分兩步完成重載解析的原因。 對於示例f(g(x))
x
選擇g
g(x)
的類型T T
選擇f
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.