Здравствуйте, σ, Вы писали:
V>>Если определение дать сразу, то все ок. Мне кажется это сакс какой-то, это так и должно быть? σ>Так должно быть.
Тогда почему это работает с методами класса? Дело в том что у меня привычка делать сначала объявление класса, а затем уже ниже реализовывать его методы. Так вот в такой схеме все работает, почему?
Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?
V>>>Если определение дать сразу, то все ок. Мне кажется это сакс какой-то, это так и должно быть? σ>>Так должно быть.
V>Тогда почему это работает с методами класса? Дело в том что у меня привычка делать сначала объявление класса, а затем уже ниже реализовывать его методы. Так вот в такой схеме все работает, почему?
Можно код увидеть?
V>Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?
Здравствуйте, σ, Вы писали:
V>>Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?
σ>Ничего не понял.
Получается что тело constexpr метода должно быть полностью определено до места где он используется, так? То-есть это полная аналогия с шаблонами, consexpr метод должен быть в .h файле, если я хочу использовать его в разных единицах трансляции, даже если он не является шаблонным?
Здравствуйте, Videoman, Вы писали:
σ>>Ничего не понял.
V>Получается что тело constexpr метода должно быть полностью определено до места где он используется, так? То-есть это полная аналогия с шаблонами, consexpr метод должен быть в .h файле, если я хочу использовать его в разных единицах трансляции, даже если он не является шаблонным?
Сорян, но как ты себе это представляешь?
Вот в хидере ты объявил constexpr функцию, положил её определение в cpp, сам компилишь другой cpp (хидер подключил, да). И как это должно работать? Компилятор тебе не телепат
Здравствуйте, Marty, Вы писали:
M>Сорян, но как ты себе это представляешь? M>Вот в хидере ты объявил constexpr функцию, положил её определение в cpp, сам компилишь другой cpp (хидер подключил, да). И как это должно работать? Компилятор тебе не телепат
объявление constexpr не означает что она может быть вызвана только в компилтайм.
для не constexpr аргументов она ведет себя как обычная функция.
Здравствуйте, night beast, Вы писали:
NB>объявление constexpr не означает что она может быть вызвана только в компилтайм. NB>для не constexpr аргументов она ведет себя как обычная функция.
А static_assert из оригинального поста тоже в рантайме работать должен?
Здравствуйте, 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-выражению и инстанцированию шаблона нужно определение метода на этапе компиляции — это сильно расстраивает.
Здравствуйте, Marty, Вы писали:
NB>>объявление constexpr не означает что она может быть вызвана только в компилтайм. NB>>для не constexpr аргументов она ведет себя как обычная функция.
M>А static_assert из оригинального поста тоже в рантайме работать должен?
Здравствуйте, 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 же управляет ходом компиляции, и решение надо принимать немедленно
Здравствуйте, Videoman, Вы писали:
V>Как вообще тогда работать с constexp-кодом, как с шаблонами, но без возможности декларации? Т.е. получается в .cpp тело уже не поместить?
Если тело в срр, то как раздельно компилировать такой код?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
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));
компилируется, что ли?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>А где ты увидел разницу с шаблонами? E>У тебя что,
static_assert(func1(0));
компилируется, что ли?
Да, вы правы — static_assert не комприлируется. Я уже разобрался. Проблема в том что, пока, для меня, static_assert единственный способ проверить что constexpr — будет реально вычисляться во время компиляции и я нигде не ошибся. В шаблонах, в рамках одной единицы компиляции я могу свободно разносить объявление и определения. С constexpr, если не использовать static_assert, то меняется сам смысл конструкций, они молча начинают вызываться во время выполнения, ни предупреждений, ничего.
Здравствуйте, Videoman, Вы писали:
V>Проблема в том что, пока, для меня, static_assert единственный способ проверить что constexpr — будет реально вычисляться во время компиляции и я нигде не ошибся.
Проблема в том, что ты не любишь макросы: http://rsdn.org/forum/cpp/7710703