函式模板中const string 型別的形參為什麼不能傳入C風格字串 ?

時間 2021-06-21 19:38:27

1樓:杜紫童

你誤解了模板的用法,不是你寫了特化就一定會使用特化版本。

當你使用原生字串的時候,模板引數T是const char * ,呼叫的是chen::add而不是chen::add。

2樓:Muchan

模板引數推導發生在過載決議之前。

編譯add("hello", " my laddy")時,根據第乙個引數推導T = const char[6],根據第二個引數推導T = const char[10],推導失敗。——沒錯,編譯器連推導成const char*都不會嘗試。

主模板推導失敗的結果就是直接不考慮這個模板了,包括它所有的例項化和特化。此時如果有乙個普通函式接受string型別引數,那麼它會正常參與過載決議並被選中,但很遺憾此處string版是模板的例項化,於是被忽略了,沒有任何乙個函式接受這兩個引數。

說回例項化。就算傳入的兩個C風格字串是等長的,也不會選中string版,原因仍然是順序:編譯器首先推導出T的實際型別,然後才檢視相應的例項化和特化。

這裡T被推導為const char[x],不是string,過載決議並不會考慮這個模板的T = string的例項化。

為什麼c 沒有使用函式模板過載qsort等函式,是因為沒有必要嗎?

暮無井見鈴 C 有 sort 其實標準紙面上 qsort 有過載,不過不是函式模板,而實現上 給 qsort 新增過載看起來沒有什麼方便的。C 增加 C 標準庫函式的過載主要就幾個模式 部分 str wcs mem 系列函式增加過載,為了 const 正確性 大多數數學函式為各種算術型別提供過載,而...

函式模板提倡直接定義 而非申明 在 h檔案裡,為什麼不用擔心 h被包含後出現重定義錯誤?

熊起 這事兒有的操心,因為編譯器只保證你若都寫.h裡,行為可以一致,如果在不同CPP裡搞幾份不一樣的同宣告模板函式,可能就選了唯一的某個版本.剛用VC2019測了一下 testfoo.cpp template int testfoo T return sizeof T 11 int externfo...

請問c 模板函式如何限定引數型別?

Lee Revere template T void test T t requires std is same v std is same v std is same v std is same v 或者concept namespace detail template VALID T void ...