Open apolukhin opened 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 тоже есть, но достичь консенсуса по этой теме не удается.
Предложение https://wg21.link/P1045 не очень понравилось разработчикам компиляторов, но автор продолжает над ним работу
Перенос предложения: голоса +6, -0 Автор идеи: Николай
Коллеги, предлагаю для чистых-constexpr функций, вместо constexpr! просто пометить аргументы функции спецификатором constexpr. Кроме этого, если пометить лишь несколько аргументов, то это будет означать, что компилятору стоит ожидать вызова этой функции с уже готовой constexpr-переменной.