Почему оператор == () в std :: array не помечен как constexpr?

Сравнивать вполне естественно std::array во время компиляции; и его operator==(), очевидно, constexpr'able. Тем не менее - он не отмечен constexpr. Это преднамеренное или недосмотр? И - по какой причине он остался таким (видимо, и в C ++ 17)?


person einpoklum    schedule 20.08.2017    source источник


Ответы (2)


P0031 объяснил, почему он не предлагал constexpr сравнения:

В настоящее время сравнения и _2 _ / _ 3_ могут быть реализованы с помощью алгоритмов из заголовка <algorithm>. Пометка сравнений с constexpr нарушит эту способность и потенциально приведет к снижению производительности.

Например, == может быть реализован в виде std::equal, который в соответствующих случаях может вызывать высокооптимизированный-но-решительно-не constexpr memcmp. Создание constexpr для == исключит эту оптимизацию без специальной помощи компилятора.

person T.C.    schedule 20.08.2017
comment
Дэниел Крюгер говорит: Это может быть решено, когда / если предложение P0202 принят. - person einpoklum; 20.08.2017

Обоснование может быть таким: == массива может быть только constexpr, если == содержащегося типа тоже constexpr.

Поскольку контейнер не может обеспечить это, он (как правило) не может предложить operator==() constexpr.

person Marcus Müller    schedule 20.08.2017
comment
Первое предложение верно для любой шаблонной функции constexpr, которая что-либо делает со своим параметром шаблона. И - это вполне может быть сделано _1 _..., так что это не так. (PS - Не мой голос против.) - person einpoklum; 20.08.2017
comment
Мне сложно придумать шаблонную функцию constexpr, которая заслуживает этого имени и имеет дело с членами типа, отличными от constexpr ... - person Marcus Müller; 20.08.2017