2015-06-24 2 views
5

Пункт 13 из «Эффективного современного C++» Скотта Майерса предпочитает const_iterators над итераторами. Я согласен, но я также хочу использовать функции, отличные от членов, а не функции-члены. Согласно книге, в C++ 14 должна существовать функция нечлена std::cbegin() и std::cend().Поддержка `std :: cbegin()` в C++ 14

Чтобы использовать эту функцию, я только что установил gcc версии 4.9.2 и скомпилировал флаг -std=c++14. Кажется, он компилируется, пока я не попытаюсь использовать std::cbegin(). Я начинаю искать поддержку для этой функции, но ничего не могу найти об этом. Например, в gnu onlinedocs status функция даже не упоминается.

Мой вопрос: std::cbegin() и std::cend() действительно поддерживаются в C++ 14 или это ошибка в книге? Если это будет функция C++ 14, есть ли компиляторы, которые уже поддерживают эти функции и когда gcc ее поддерживает?

В SO около begin() есть много вопросов, но эти вопросы касаются функций-членов или о constexpr-ness, а не о поддержке варианта, не являющегося членом.

ответ

1

Поддержка GCC 4.9 для C++ 14 является экспериментальной и неполной. Но here, вы можете увидеть, что

глобальных функции cbegin, cend, rbegin, разрывать, crbegin и crend ​​для доступа диапазона для контейнеров, массивов и списков инициализатора.

было добавлено в GCC 5.1.

2

Да, они находятся на C++ 14. Они были добавлены library issue, а не бумагой, и похоже, что страница руководства libstdC++ не отслеживает проблемы с библиотекой.

Они реализованы в GCC 5.1. См. GCC bug 64656.

+0

Это было мое предложение. Только я сам этого не писал, потому что он должен был быть написан вместо меня членом Комитета. :) –

1

Да, они описывают их вместе с begin/end.

И этот стандарт определяет его в разделе 24.7 - Range access. Я не цитирую его, потому что это набор определений функций шаблонов, которые согласуются с приведенными выше ссылками.

Проект, который должен быть очень близок к финальной версии (я не могу вспомнить номер для окончательного проекта, извините): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

В самом деле, вы можете играть со встроенными примерами на cppreference и изменить begin и end звонки на cbegin/cend и попытаться запустить их. gcc 4.9 жалуется, хотя gcc 5.1 уже работает, а также clang 3.6. Так что это всего лишь вопрос поддержки компилятора.

Смежные вопросы