[英]What does a for statement with an ellipsis after the keyword 'for' do?
我看過這段代碼:
template <class... TYPES>
constexpr void tuple<TYPES...>::swap(tuple& other)
noexcept((is_nothrow_swappable_v<TYPES> and ...))
{
for...(constexpr size_t N : view::iota(size_t(0), sizeof...(TYPES))) {
swap(get<N>(*this), get<N>(other));
}
}
構造for...
做什么?
截至 2021 年,這不是標准的 C++。
這是一個提議的語法(命名為“擴展語句”),用於可以描述為或多或少類似於if constexpr
的循環:編譯時循環構造,在語法上展開。 與普通循環相比,它的優勢在於它允許迭代異構類型的結構。
這種語法將允許編寫如下循環:
std::tuple<int, const char *, double> t { 42, "hello", 69.420 };
for... (auto x : t) {
std::cout << x << std::endl;
}
意思大致相同:
std::tuple<int, const char *, double> t { 42, "hello", 69.420 };
{
auto x = std::get<0>(t);
std::cout << x << std::endl;
}
{
auto x = std::get<1>(t);
std::cout << x << std::endl;
}
{
auto x = std::get<2>(t);
std::cout << x << std::endl;
}
在上面的for...
循環中,在每次迭代中, x
變量都有不同的類型; 可以說,每次迭代都有一個單獨的、獨立的變量。 在普通循環中,變量的類型在迭代之間是共享的,這意味着循環不能通過類型檢查。
這種語法最初是在P1306R0中提出的,它還描述了一個相關但不同for constexpr
( 以下修訂將兩者統一起來)。 P1858R1 為其引入了另一種語法template for
,取代了省略號語法。
顯然預計此功能將包含在 C++23 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.