![](/img/trans.png)
[英]Error - Functions that differ only in their return types cannot be overloaded. 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在這里錯了嗎?
為什么語言對模板做出這樣的例外?
你是這個意思?
⟨函數模板⟩名稱、參數類型列表、封閉命名空間(如果有)、返回類型、模板頭和尾隨要求子句(如果有)
是的,返回類型在那里。 這就是讓事情成為可能的原因
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.