簡體   English   中英

僅在 C++ 中的返回類型不同的重載函數模板

[英]Overloaded function templates that differ only in their return types in C++

眾所周知,僅返回類型不同的普通函數不能在 C++ 中重載。

但是這個限制不適用於重載的函數模板,例如:

int f(auto) { return 1; }
auto f(auto) { return 2; }

所有編譯器都接受它,演示: https ://gcc.godbolt.org/z/qj73Mzehd

為什么語言對模板做出這樣的例外?

如果重載函數的返回類型不同,則可以使用強制轉換為預期的函數類型來選擇其中一個函數。 令人驚訝的是,即使返回類型實際上相同,Clang 也允許人們解決歧義,例如:

((int(*)(int))f)(3);

選擇

int f(auto) { return 1; }

演示: https ://gcc.godbolt.org/z/snfvbq1ME

Clang在這里錯了嗎?

為什么語言對模板做出這樣的例外?

你是這個意思?

簽名[defns.signature.templ]

⟨函數模板⟩名稱、參數類型列表、封閉命名空間(如果有)、返回類型、模板頭和尾隨要求子句(如果有)

是的,返回類型在那里。 這就是讓事情成為可能的原因

template<typename T>
typename std::enable_if<std::is_integral<T>::value>::type foo(T&);

template<typename T>
typename std::enable_if<!std::is_integral<T>::value>::type foo(T&);

SFINAE 是返回類型包含在簽名中的原因。 返回類型中可能出現替換失敗,因此它是簽名比較的一部分。 您仍然可以潛在地生成兩個相互沖突的特化來重載(在一般情況下,而不是在示例中),但模板會有所不同。

暫無
暫無

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

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