С ++ 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).
Вопрос:
- C++ 14 НЕ позволяет нечлену
std::begin()
в constexpr контекста для «стандартных контейнеров», таких какstd::array
, потому что они не обеспечивают constexpr- функцииbegin()
члена. Является ли моя интерпретация правильной? - Почему не участник
std::cbegin()
естьconstexpr
-спецификатор? Для контейнера, предоставляемого пользователем, который имеет constexpr-begin()
функция-член?
'std :: cbegin' вызывает' std :: begin', который не является 'constexpr' ... с двумя исключениями: [перегрузка initializer_list'] (http://en.cppreference.com/w/cpp/utility/initializer_list/begin2) и массив. –
За вопрос №2, если вы его удалили, у вас больше не будет 'constexpr' для необработанного массива' cbegin'. –