опять неопонятки с constexpr
От: Videoman Россия http://www.htsproduction.com/
Дата: 18.05.20 22:43
Оценка:
В VS2017 имеем следующий код:
static constexpr bool Test(int value); // объявление

....

static_assert(Test(0));

....

static constexpr bool Test(int value) // определение
{
    return value == 0;
}

error C2131: expression did not evaluate to a constant

Если определение дать сразу, то все ок. Мне кажется это сакс какой-то, это так и должно быть?
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re: опять неопонятки с constexpr
От: σ  
Дата: 18.05.20 23:38
Оценка:
V>Если определение дать сразу, то все ок. Мне кажется это сакс какой-то, это так и должно быть?
Так должно быть.
Отредактировано 18.05.2020 23:48 σ . Предыдущая версия . Еще …
Отредактировано 18.05.2020 23:42 σ . Предыдущая версия .
Re[2]: опять неопонятки с constexpr
От: Videoman Россия http://www.htsproduction.com/
Дата: 19.05.20 07:48
Оценка:
Здравствуйте, σ, Вы писали:

V>>Если определение дать сразу, то все ок. Мне кажется это сакс какой-то, это так и должно быть?

σ>Так должно быть.

Тогда почему это работает с методами класса? Дело в том что у меня привычка делать сначала объявление класса, а затем уже ниже реализовывать его методы. Так вот в такой схеме все работает, почему?

Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[3]: опять неопонятки с constexpr
От: σ  
Дата: 19.05.20 09:39
Оценка:
V>>>Если определение дать сразу, то все ок. Мне кажется это сакс какой-то, это так и должно быть?
σ>>Так должно быть.

V>Тогда почему это работает с методами класса? Дело в том что у меня привычка делать сначала объявление класса, а затем уже ниже реализовывать его методы. Так вот в такой схеме все работает, почему?


Можно код увидеть?

V>Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?


Ничего не понял.
Re[4]: опять неопонятки с constexpr
От: Videoman Россия http://www.htsproduction.com/
Дата: 19.05.20 10:30
Оценка:
Здравствуйте, σ, Вы писали:

V>>Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?


σ>Ничего не понял.


Получается что тело constexpr метода должно быть полностью определено до места где он используется, так? То-есть это полная аналогия с шаблонами, consexpr метод должен быть в .h файле, если я хочу использовать его в разных единицах трансляции, даже если он не является шаблонным?
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[5]: опять неопонятки с constexpr
От: Marty Пират  
Дата: 19.05.20 10:41
Оценка:
Здравствуйте, Videoman, Вы писали:

σ>>Ничего не понял.


V>Получается что тело constexpr метода должно быть полностью определено до места где он используется, так? То-есть это полная аналогия с шаблонами, consexpr метод должен быть в .h файле, если я хочу использовать его в разных единицах трансляции, даже если он не является шаблонным?


Сорян, но как ты себе это представляешь?
Вот в хидере ты объявил constexpr функцию, положил её определение в cpp, сам компилишь другой cpp (хидер подключил, да). И как это должно работать? Компилятор тебе не телепат
Re[6]: опять неопонятки с constexpr
От: night beast СССР  
Дата: 19.05.20 10:55
Оценка:
Здравствуйте, Marty, Вы писали:

M>Сорян, но как ты себе это представляешь?

M>Вот в хидере ты объявил constexpr функцию, положил её определение в cpp, сам компилишь другой cpp (хидер подключил, да). И как это должно работать? Компилятор тебе не телепат

объявление constexpr не означает что она может быть вызвана только в компилтайм.
для не constexpr аргументов она ведет себя как обычная функция.
Re[7]: опять неопонятки с constexpr
От: Marty Пират  
Дата: 19.05.20 10:56
Оценка:
Здравствуйте, night beast, Вы писали:

NB>объявление constexpr не означает что она может быть вызвана только в компилтайм.

NB>для не constexpr аргументов она ведет себя как обычная функция.

А static_assert из оригинального поста тоже в рантайме работать должен?
Re[6]: опять неопонятки с constexpr
От: Videoman Россия http://www.htsproduction.com/
Дата: 19.05.20 11:01
Оценка:
Здравствуйте, Marty, Вы писали:

M>Сорян, но как ты себе это представляешь?

M>Вот в хидере ты объявил constexpr функцию, положил её определение в cpp, сам компилишь другой cpp (хидер подключил, да). И как это должно работать? Компилятор тебе не телепат

Я не представляю. Тем не менее, лучше спросить что бы быть точно уверенным. Я кучу раз делал разные логические умозаключения и казалось все логично и ты понимаешь как это устроено, и жутко обламывался. Раз ты призываешь к логике, объясни тогда пожалуйста (все происходит в одной единице трансляции ххх.h):
template<typename type_t>
bool func1(type_t value);
template<typename type_t>
constexpr bool func2(type_t value);

// ...

const bool res1 = func1(0);     // В результате все работает и даже инлайнится хотя еще нет определения
constexpr bool res2 = func2(0); // Вот тут работает в точности как и первый вариант, а не как выражение на этапе компиляции
static_assert(func2(0));    // Ошибка: Вот тут мы только узнаем что оказывается func2 работает как обычная функция

// ...

template<typename type_t>
inline bool func1(type_t value)
{
  return value == 0;
}

template<typename type_t>
inline constexpr bool func2(type_t value)
{
  return value == 0;
}

Меня смущает что даже в одной единице трансляции мы имеем разное поведение в сравнении с шаблонами, хотя по идее, и constexr-выражению и инстанцированию шаблона нужно определение метода на этапе компиляции — это сильно расстраивает.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[8]: опять неопонятки с constexpr
От: night beast СССР  
Дата: 19.05.20 11:01
Оценка:
Здравствуйте, Marty, Вы писали:

NB>>объявление constexpr не означает что она может быть вызвана только в компилтайм.

NB>>для не constexpr аргументов она ведет себя как обычная функция.

M>А static_assert из оригинального поста тоже в рантайме работать должен?


я отвечал не на оригинальный пост.
Re[7]: опять неопонятки с constexpr
От: Marty Пират  
Дата: 19.05.20 11:09
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Я не представляю. Тем не менее, лучше спросить что бы быть точно уверенным. Я кучу раз делал разные логические умозаключения и казалось все логично и ты понимаешь как это устроено, и жутко обламывался. Раз ты призываешь к логике, объясни тогда пожалуйста (все происходит в одной единице трансляции ххх.h):

V>
V>const bool res1 = func1(0);     // В результате все работает и даже инлайнится хотя еще нет определения
V>constexpr bool res2 = func2(0); // Вот тут работает в точности как и первый вариант, а не как выражение на этапе компиляции
V>static_assert(func2(0));    // Ошибка: Вот тут мы только узнаем что оказывается func2 работает как обычная функция
V>

V>Меня смущает что даже в одной единице трансляции мы имеем разное поведение в сравнении с шаблонами, хотя по идее, и constexr-выражению и инстанцированию шаблона нужно определение метода на этапе компиляции — это сильно расстраивает.

Если честно, я новый C++ практически не знаю. Полагаю, что второе выражение будет вычислено на этапе компиляции, но компилятор смог отложить его вычисление на потом. Если не найдёт тела func2, то выдаст потом ошибку. static_assert же управляет ходом компиляции, и решение надо принимать немедленно
Re[3]: опять неопонятки с constexpr
От: Erop Россия  
Дата: 21.05.20 06:38
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?


Если тело в срр, то как раздельно компилировать такой код?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: опять неопонятки с constexpr
От: Erop Россия  
Дата: 21.05.20 06:42
Оценка:
Здравствуйте, Videoman, Вы писали:

V>
V>const bool res1 = func1(0);     // В результате все работает и даже инлайнится хотя еще нет определения
V>constexpr bool res2 = func2(0); // Вот тут работает в точности как и первый вариант, а не как выражение на этапе компиляции
V>static_assert(func2(0));    // Ошибка: Вот тут мы только узнаем что оказывается func2 работает как обычная функция
V>

V>Меня смущает что даже в одной единице трансляции мы имеем разное поведение в сравнении с шаблонами, хотя по идее, и constexr-выражению и инстанцированию шаблона нужно определение метода на этапе компиляции — это сильно расстраивает.

А где ты увидел разницу с шаблонами?
У тебя что,
static_assert(func1(0));
компилируется, что ли?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: опять неопонятки с constexpr
От: Videoman Россия http://www.htsproduction.com/
Дата: 21.05.20 11:47
Оценка:
Здравствуйте, Erop, Вы писали:

E>А где ты увидел разницу с шаблонами?

E>У тебя что,
static_assert(func1(0));
компилируется, что ли?


Да, вы правы — static_assert не комприлируется. Я уже разобрался. Проблема в том что, пока, для меня, static_assert единственный способ проверить что constexpr — будет реально вычисляться во время компиляции и я нигде не ошибся. В шаблонах, в рамках одной единицы компиляции я могу свободно разносить объявление и определения. С constexpr, если не использовать static_assert, то меняется сам смысл конструкций, они молча начинают вызываться во время выполнения, ни предупреждений, ничего.
http://www.gravatar.com/avatar/60560936caa07b944d4c3cecf1c06cc5?s=80&d=identicon
Re[9]: опять неопонятки с constexpr
От: Vain Россия google.ru
Дата: 11.06.20 15:54
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Проблема в том что, пока, для меня, static_assert единственный способ проверить что constexpr — будет реально вычисляться во время компиляции и я нигде не ошибся.

Проблема в том, что ты не любишь макросы: http://rsdn.org/forum/cpp/7710703
Автор: Vain
Дата: 19.04 16:41

Но это точно не единственный способ.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.