2015-02-03 2 views
3

С ++ 11 введена std::begin() функции, не являющийся членом без constexpr -specifier, а затем в C++ 14 обновлений для constexpr- std::begin() для типа массива (T (&)[N]) и добавляет constexpr- std::cbegin() для общего типа контейнера (const C&)., не являющиеся членов начинает()/(cbegin) и его constexpr-ность

Цитата http://en.cppreference.com/w/cpp/iterator/begin

template< class T, size_t N > 
constexpr T* begin(T (&array)[N]); // (since C++14) 

template< class C > 
constexpr auto cbegin(const C& c) -> decltype(std::begin(c)); // (since C++14) 

Таким образом, мы можем использовать std::begin() и/или std::cbegin() в constexpr контексте для сырьевого типа массива T[N] (для C++ 14 функции constexpr).

Вопрос:

  1. C++ 14 НЕ позволяет нечлену std::begin() в constexpr контекста для «стандартных контейнеров», таких как std::array, потому что они не обеспечивают constexpr- функции begin() члена. Является ли моя интерпретация правильной?
  2. Почему не участник std::cbegin() есть constexpr -спецификатор? Для контейнера, предоставляемого пользователем, который имеет constexpr- begin() функция-член?
+1

'std :: cbegin' вызывает' std :: begin', который не является 'constexpr' ... с двумя исключениями: [перегрузка initializer_list'] (http://en.cppreference.com/w/cpp/utility/initializer_list/begin2) и массив. –

+2

За вопрос №2, если вы его удалили, у вас больше не будет 'constexpr' для необработанного массива' cbegin'. –

ответ

2

Текущий constexpr Поддержка в стандартной библиотеке действительно довольно ограничена.

  1. не являющегося членом std::begin не отмечен constexpr потому что кроме array и initializer-list, нет стандартного контейнера (или контейнера, как лица, такие как bitset) поддерживает constexpr элемент begin() (в основном потому, что некоторые реализации требуется использовать отладку итератора с помощью динамического выделение памяти). Ваша интерпретация здесь верна.
  2. не являющегося членом std::cbegin помечается constexpr для того, чтобы поддержать (в настоящее время) два constexprstd::begin функции, не являющиеся членами для array и initializer_list, и быть вперед-совместимым для будущих обновлений в стандартной библиотеке.

Что касается пункта 2, это не так полезно для определенного пользователем контейнера, как субъектов, так как там принято идиома определить, не являющееся членом begin() и end() в пространстве имен окружающих определенный пользователем тип, а не в namespace std.

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