Я думаю, что смысл Эрика в отношении std::begin
состоит в том, что он молча принимает контейнер значения в качестве аргумента для начала.На первый взгляд, проблема с кодом также проиллюстрирована в
auto it = get_data().begin();
Но std::begin
- это бесплатный шаблон функции, его можно сделать, чтобы отклонять значения без необходимости добавлять соответствующие ссылочные квалификаторы вbegin
членов каждого контейнера.«Просто» переадресация упускает возможность добавить уровень безопасности памяти в код.
В идеале, набор перегрузки мог бы выиграть от добавления
template< class C >
void begin( C&& ) = delete;
Это могло бы привести к тому, что код в посте блога был отклонен на месте.