Сравнивать вполне естественно std::array
во время компиляции; и его operator==()
, очевидно, constexpr
'able. Тем не менее - он не отмечен constexpr
. Это преднамеренное или недосмотр? И - по какой причине он остался таким (видимо, и в C ++ 17)?
Почему оператор == () в std :: array не помечен как constexpr?
Ответы (2)
P0031 объяснил, почему он не предлагал constexpr
сравнения:
В настоящее время сравнения и _2 _ / _ 3_ могут быть реализованы с помощью алгоритмов из заголовка
<algorithm>
. Пометка сравнений с constexpr нарушит эту способность и потенциально приведет к снижению производительности.
Например, ==
может быть реализован в виде std::equal
, который в соответствующих случаях может вызывать высокооптимизированный-но-решительно-не constexpr
memcmp
. Создание constexpr
для ==
исключит эту оптимизацию без специальной помощи компилятора.
person
T.C.
schedule
20.08.2017
Дэниел Крюгер говорит: Это может быть решено, когда / если предложение P0202 принят.
- person einpoklum; 20.08.2017
Обоснование может быть таким: ==
массива может быть только constexpr
, если ==
содержащегося типа тоже constexpr
.
Поскольку контейнер не может обеспечить это, он (как правило) не может предложить operator==() constexpr
.
person
Marcus Müller
schedule
20.08.2017
Первое предложение верно для любой шаблонной функции constexpr, которая что-либо делает со своим параметром шаблона. И - это вполне может быть сделано _1 _..., так что это не так. (PS - Не мой голос против.)
- person einpoklum; 20.08.2017
Мне сложно придумать шаблонную функцию constexpr, которая заслуживает этого имени и имеет дело с членами типа, отличными от constexpr ...
- person Marcus Müller; 20.08.2017