Добавить квалификатор constexpr к аргументам функций и лямбд

nerikhman
nerikhman
template <typename Integral>
constexpr auto fn (constexpr Integral v)
{
    static_assert(v > 0);
    return v;
}
5
рейтинг
6 комментариев
nerikhman

Продублирую текст здесь:

 

Коллеги, предлагаю для чистых-constexpr функций, вместо constexpr! просто пометить аргументы функции спецификатором constexpr. Кроме этого, если пометить лишь несколько аргументов, то это будет означать, что компилятору стоит ожидать вызова этой функции с уже готовой constexpr-переменной.

nerikhman
yndx-antoshkka

nerikhman, разработчики компиляторов говорят что в этоv случае у них возникает серьёзная проблема на ряде имплементаций.

Ну и кроме того

constexpr! int foo(int a, int b, int c) { /*...*/ }

короче чем

int foo(constexpr int a, constexpr int b, constexpr int c) { /*...*/ }

yndx-antoshkka
asschool

nerikhman, сейчас нельзя написать функцию (compiletime nonprimitive a, runtime b) -> c (констекспр параметры нужны только для этого), возможно ослабление ограничений параметров шаблона после введения оператора<=> улучшит ситуацию, если это реально когда-нибудь будет

asschool
Андрей Руссков

yndx-antoshkka, зато появилась бы возможность внедрять перегрузки по вычислимости в compile-time

Андрей Руссков
Andrey

asschool, ослабление ограничений параметров шаблона принято в C++20, что уже позволяет писать удивительный код:

#include <chrono>

template<auto> int i;

using namespace std::chrono_literals;

static_assert(1min == 60s);
static_assert(&i<1min> != &i<60s>);

Добавим сюда constexpr function parameters:

constexpr int * ptr(constexr auto)
{
  static int result = 0;
  return &result;
}

static_assert(ptr(1) != ptr(2)) // поскольку это разные инстанциации
                                // неявно шаблонной функции ptr

static_assert(1min == 60s);
static_assert(ptr(1min) != ptr(60s)); // constexpr функция от равных аргументов
                                      // возвращает разные значения,
                                      // как тебе такое Элон Маск?
Andrey
Обновлено 
Andrey

Вы, наверное, знаете, что contsexpr параметры это отдельная и несколько более сложная (по сравнению с constexpr!) идея? Proposal на constexpr parameters тоже есть, но достичь консенсуса по этой теме не удается. 

Andrey
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения