簡體   English   中英

為什么 const char[] 上的類型推導與 const char * 不同?

[英]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 = {};

這意味着當Tchar[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來推斷TParameterType 如果ParameterType包含諸如const類的限定符,則TParameterType是不同的。

如果ParameterType既不是指針也不是引用(您的 show1, T const的情況), T的類型是沒有constvolatile和引用的expression類型。 所以Tconst char *的類型。 ParameterTypea類型)是const char * const

如果ParameterType (您的 show2 中的T const & )是指針或引用(但不是像T&&這樣的引用)。 首先忽略參考,它給出結果T const (與const T相同)。 第二個匹配類型的expressionconst char [] )到const T ,所以Tchar []

有關更多信息, Scott Meyers 的 Effective Modern C++ 的第 1 項正是您想要的。 規則比我在這里描述的更復雜,但非常重要。

暫無
暫無

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

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