cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +6, -0 Автор идеи: Николай

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

template <typename Integral>
constexpr auto fn (constexpr Integral v)
{
    static_assert(v > 0);
    return v;
}
apolukhin commented 3 years ago

Николай, 20 июля 2018, 20:37 Продублирую текст здесь:

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

yndx-antoshkka, 23 июля 2018, 10:57 nerikhman, разработчики компиляторов говорят что в этоv случае у них возникает серьёзная проблема на ряде имплементаций.

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

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

короче чем

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

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

Андрей Руссков, 4 августа 2018, 1:45 yndx-antoshkka, зато появилась бы возможность внедрять перегрузки по вычислимости в compile-time

Andrey, 6 августа 2018, 22:38 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, 23 июля 2018, 8:14 Вы, наверное, знаете, что contsexpr параметры это отдельная и несколько более сложная (по сравнению с constexpr!) идея? Proposal на constexpr parameters тоже есть, но достичь консенсуса по этой теме не удается.

apolukhin commented 3 years ago

Предложение https://wg21.link/P1045 не очень понравилось разработчикам компиляторов, но автор продолжает над ним работу