簡體   English   中英

為什么C ++ 20模板lambda使用typename關鍵字?

[英]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.

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