В каких ситуациях `ranges::for_each` работает, а `for (auto&& elt : rg)` не работает?C++

Программы на C++. Форум разработчиков
Anonymous
В каких ситуациях `ranges::for_each` работает, а `for (auto&& elt : rg)` не работает?

Сообщение Anonymous »

Учитывая следующий код C++23 (Godbolt):

Код: Выделить всё

template
concept container_compatible_range =
std::ranges::input_range && std::convertible_to;

template
struct Map {
using value_type = std::pair;

template
requires container_compatible_range
void insert_range_bad(R&& rg) {
for (value_type e : rg) {
// ~~~~
}
}

template
requires container_compatible_range
void insert_range_good(R&& rg) {
std::ranges::for_each(rg, [&](value_type e) {
// ~~~~
});
}
};

int main() {
Map m;
std::tuple a[2] = {};  // for example
m.insert_range_bad(a);
m.insert_range_good(a);
}
Мне говорили, что существуют «надуманные крайние случаи», когда Insert_range_good успешно скомпилируется, а Insert_range_bad завершится неудачей (в недружественном к SFINAE, жестком -ошибка) и/или сделать неправильный поступок.
Что это за крайние случаи?

Подробнее здесь: https://stackoverflow.com/questions/792 ... lt-rg-fail

Вернуться в «C++»