[英]Why are C++20 template lambdas using typename keyword?
我理解一致性參數,但是模板的大多數參數都是類型,因此我認為,由於lambda是用於定義結構的簡潔方法,因此它可能應該默認為typename
/ class
(您仍然需要編寫int/size_t/short
)。
如果有人不熟悉C ++ 20中對lambda的更改,請參考以下示例:
[]<typename T>(const std::vector<T>& v)
{
for(const auto& x : v) { std::cout << x; }
};
我的問題是為什么不這樣做:
[]<T>(const std::vector<T>& v)
{
for(const auto& x : v) { std::cout << x; }
};
問題在於,這已經具有含義:
template <T> void foo();
這是具有一個模板參數的功能模板,該模板參數是類型為T
的非類型模板參數,並且該模板參數沒有名稱。
如果相同的語法意味着非常不同的事情,這取決於您要引入函數模板還是泛型lambda,即兩個具有相似用途的非常相似的上下文,那將非常令人困惑。
再加上...如果您實際上想要一個非類型的模板參數,您將怎么辦? 只是不能擁有一個?
雖然簡潔確實是lambda的賣點,但它不足以取代對一致性的需求。 對於涉及模板的功能尤其如此,因為與非模板語言功能相比,它們更難掌握。
特別是,通用lambda的模板語法首先具有狹窄的范圍,即,大多數lambda可以在沒有它的情況下生存(實際上,您給出的示例是不使用它的完美示例,因為函數體沒有實例化一個T
或做類似的事情。 從P0428 (強調我的):
作者認為當前定義通用lambda的語法不足的幾個關鍵原因。 其要點是,使用常規函數模板可以輕松完成的某些事情需要使用通用lambda來完成,或者根本無法完成。
體內使用decltype
通用lambda可能是新功能的最主要客戶。 就附加的鍵入和簡潔性而言,用<typename T>
代替decltype
/ decay_t
-trickery對於我來說似乎更可接受。
如果你只是寫
[]<T>(){ }
什么是T
?
typename
? auto
值?
在我看來,在lambda中,就像在通用函數中一樣,有必要明確說明什么是模板參數。
並且,如果可以從用途中推斷出T
是類型(如果將其用作std::vector
第一個模板參數,則必須是類型),為什么只簡化lambda語法,而不簡化傳統模板函數的語法?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.