![](/img/trans.png)
[英]Why is the comparison between const char[] and const char* different?
[英]Why is type deduction on const char[] different to const char *?
在第一次調用中,當我將char const []
傳遞給模板 function 並帶有T const a
參數時, T
被推斷為char const *
這是合理的,因為const
指的是衰減指針。
但是,當參數類型更改為T const & a
時, T
推導出為char[7]
。 從上面的角度來看,為什么const
不能限定整個數組類型?
template <typename T>
void show1(T const a) {
// input is const char *
// T is char const *
// a is char const * const
}
template <typename T>
void show2(T const & a) {
// input is char const [7]
// T is char[7]
// a is char const (&)[7]
}
int main() {
const char s[] = "asdasd";
show1(s);
show2(s);
}
為什么
const
不能限定整個數組類型
因為對於數組類型,
(強調我的)
將cv 限定符應用於數組類型(通過 typedef 或模板類型操作)將限定符應用於元素 type ,但其元素為 cv 限定類型的任何數組類型都被認為具有相同的 cv 限定。
// a and b have the same const-qualified type "array of 5 const char" typedef const char CC; CC a[5] = {}; typedef char CA[5]; const CA b = {};
這意味着當T
是char[7]
T const
導致類型char const[7]
,然后T const&
(即a
的類型)是char const (&)[7]
。
另一方面,當您傳遞類型為const char[7]
的數組s
時,該數組也被認為是 const 限定的。 所以給定參數類型T const&
, T
被推導出為char[7]
(但不是char const[7]
)。
這是因為 arrays 在 C++ 中是不可復制和不可分配的。
所以在調用show1
時, const char[]
類型衰減為const char*
。 該語言允許在 function 調用站點對每個參數進行一次隱式轉換。
使用show2
,您通過引用傳遞 - 不需要復制或分配,因此不會發生指針衰減。
template <typename T>
void show(ParameterType a) {
}
show(expression);
編譯器使用expression
來推斷T
和ParameterType
。 如果ParameterType
包含諸如const
類的限定符,則T
和ParameterType
是不同的。
如果ParameterType
既不是指針也不是引用(您的 show1, T const
的情況), T
的類型是沒有const
、 volatile
和引用的expression
類型。 所以T
是const char *
的類型。 ParameterType
( a
類型)是const char * const
。
如果ParameterType
(您的 show2 中的T const &
)是指針或引用(但不是像T&&
這樣的引用)。 首先忽略參考,它給出結果T const
(與const T
相同)。 第二個匹配類型的expression
( const char []
)到const T
,所以T
是char []
。
有關更多信息, Scott Meyers 的 Effective Modern C++ 的第 1 項正是您想要的。 規則比我在這里描述的更復雜,但非常重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.