В каких ситуациях `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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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