关键字'for'后带有省略号的for语句有什么作用?
我见过这个代码:
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 中。