cpp-ru / ideas

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

constexpr operator #163

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +6, -3 Автор идеи: Antervis

Оператор constexpr( statement ) -> decltype(statement) - попытаться вычислить не объявленное явно как constexpr выражение в compile-time

Оператор constexpr( statement ) -> decltype( statement ) - попытаться вычислить не объявленное явно как constexpr выражение в compile-time, либо выдать ошибку компиляции

Допустим, мы имеем простую функцию, не объявленную как constexpr:

float foo(float x, float y) {
    return x*y;
}

Идея в том, чтобы иметь возможность вызвать её в constexpr-контексте (или выдать ошибку, если это невозможно):

constexpr float val1 = constexpr(foo(3,5)); // OK

int i;
cin >> i;
constexpr float val2 = constexpr(foo(4,i)); // fail: i is not compile-time constant

float bar();
constexpr float val3 = constexpr(foo(7,bar())); // fail: bar is declared, but not defined

float baz() { return 15.2; } // note: baz() is not marked as constexpr
constexpr float val4 = constexpr(foo(2,baz())); // OK, same as constexpr(foo(2,constexpr(baz())))

Для этого необходимо:

Как это должно работать:

Что это дает:

Пример к п.4.: например:

string str = "short str";

зная в compile-time, что Small String Optimization потенциально позволяет создать std::string из const char* длиной не более 11 символов как constexpr-значение. Но в языке нет возможности проверить аргумент runtime функции на этапе компиляции. Используя оператор constexpr() таким образом:

auto str = constexpr(string("short str"));

длина строки будет проверена на этапе компиляции, ветка с выделением памяти будет подавлена, конструктор std::string(const char *) окажется вычислимым на этапе компиляции

apolukhin commented 3 years ago

yndx-antoshkka, 29 марта 2017, 13:28 Здесь позарез нужна имплементация в одном из компиляторов, прежде чем начинать обсуждать подобное. Иначе - никак.