`std::size()`, не являющийся членом, не являющийся другом, который работает с C-массивами и векторами

Существует много выгод использования недружественные функции. Хорошим примером является использование функции-члена std::begin() вместо функции-члена .begin(),, поскольку первая будет работать и с C-массивами, а вторая не имеет смысла для C-массивов.

Также имеет смысл иметь std::size() по той же причине, по которой у нас есть std::begin(),, чтобы пользователи могли писать код вроде:

int a[] = {1,2,3};
cout << std::size(a); // to print 3

Есть ли технические проблемы, связанные с включением такой функции в стандарт?

(Возможная реализация будет просто return end(a) - begin(a);, которая будет работать как для C-массивов, так и для векторов.)


person Eissa N.    schedule 21.05.2016    source источник
comment
Ваша реализация будет работать только для контейнеров с итераторами произвольного доступа.   -  person chris    schedule 22.05.2016
comment
@ user3386109, это не очень важно. std::end работает с массивами C и может сказать вам, где находится конец массива. Таким образом, std::size тоже возможно. Ни один из них не будет работать для распавшихся массивов; это не изменилось.   -  person chris    schedule 22.05.2016
comment
@AnT Спасибо за ссылку. Мне не удалось найти ту ссылку, которая является тем же вопросом, что и у меня.   -  person Eissa N.    schedule 22.05.2016


Ответы (1)


Технических проблем нет. За него проголосовали в рабочий документ, но это произошло после выпуска C++14.

размер, не являющийся членом () и другие (редакция 2 )

Протокол Urbana WG21 2014-11

http://en.cppreference.com/w/cpp/iterator/size

Ожидайте, что он появится в C++17.

P.S. В качестве примечания: существующий std::extent можно использовать для определения размера массива, но он не объединяет неконтейнерные и контейнерные интерфейсы. Значит, это не то, о чем вы говорите.

person AnT    schedule 21.05.2016