[英]Template argument deduction of string literal
考慮這個簡單的功能
template<typename T>
void func(const T& x) {std::cout<< typeid(T).name();}
現在,如果我調用函數func("ddd")
,T推導出什么? 。 如果func
的參數中沒有const
,那么T
就是char [4]
,讓我困惑的是添加const
,T推導出什么?
它是: const char [4]
。 如果我將參數更改為T const &x
(即const
變化順序),則推導會產生T
到char const [4]
嗎?
任何人都可以用字符串文字來解釋參數推論嗎?
字符串文字是const字符的數組。
對4個字符串的字符串文字的引用是char const (&)[4]
。
const char [4]
和char const [4]
是相同的類型!
char const (&)[N]
, const char [N]
和char const [N]
都推導為char const [N]
#include <iostream>
template<typename T>
void func1(T& x) {std::cout<< typeid(T).name()<<std::endl;}
template<typename T>
void func2(const T& x) {std::cout<< typeid(T).name()<<std::endl;}
template<typename T>
void func3(T const &x) {std::cout<< typeid(T).name()<<std::endl;}
int main()
{
char c[4]= {'a','b','c','d'};
const char c1[4]= {'a','b','c','d'};
char const c2[4]= {'a','b','c','d'};
func1("abcd"); //prints char const [4]
func1(c); //prints char [4]
func1(c1); //prints char const [4]
func1(c2); //prints char const [4]
func2("abcd"); //prints char const [4]
func2(c); //prints char [4]
func2(c1); //prints char const [4]
func2(c2); //prints char const [4]
func3("abcd"); //prints char const [4]
func3(c); //prints char [4]
func3(c1); //prints char const [4]
func3(c2); //prints char const [4]
return 0;
}
現在,如果我調用函數func(),T推導出什么?
如果使用字符串文字調用,則T
推導為char const[N]
。
如果func的參數中沒有const,那么T就是char [4]
如果你的意思是,如果你聲明的參數為T& x
,則沒有: T
仍然會被推斷為char const[N]
如果你有一個字符串調用。
如果你的意思是用非const數組調用func
,那么是: T
將被推導為非const。
如果我將參數更改為T const&x
這沒有任何改變,因為const T &
只是編寫T const &
另一種方式。
const
通常指的是它前面的任何東西:
char const *
- 指向常量char的指針
char * const
- 指向char的常量指針
char const * const
- 常量char的常量指針
char Foo::bar() const
- 返回char的常量成員函數
等等
領先的 const
是一個可以追溯到C早期的例外 :
const char *
<=> char const *
因此,更改模板中的順序根本不會改變類型( T const &
<=> const T &
)。
如果您希望保持 const
布局的一致性 ,請僅使用尾隨類型,因為這是您可以一致地放置const
的唯一方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.