void test() {
std::cout << std::endl;
}
int main() {
test<void>();
return 0;
}
А вот на это ругается и не игнорирует?
constexpr void test() {
std::cout << std::endl;
}
int main() {
test();
return 0;
}
В общем-то, причины мне не особо интересны - мне нужно узнать как заставить его ругаться не только во втором, но и в первом случае. Чтобы он не игнорировал constexpr
Зарепорть как багу
Я не думаю что это бага, потому что у clangа такое же поведение
Ну вообще, программа явно ill-formed, если в констекспр функции вызывается неконстекспр функция. Может, конечно, для шаблонов функций поведение другое, но есть у меня Большииие сомнения
В чём заключается игнорирование constexpr ?
https://godbolt.org/z/rc31zn Асм-код совсем не consexpr-ный
А с чего он должен?
Ну и как оно вообще скомпилилось то... Нельзя писать в поток в compile-time
Ну асм код не аргумент
Ну вообще просто в констекспр запрещён вызов неконстекспр функций и всё
С другой стороны, я так заметил, для шаблонов функций различие в стандарте есть. Я пока не нашёл точно
Для constexpr функций не должно быть инструкции call, разве нет?
int main() { test<void>(); return 0; } тут нет constexpr-контекста.
Вот, это ifndr https://eel.is/c++draft/dcl.constexpr#7
А если убрать шаблон - то появляется или что? Компилер ругаться начинает
Главное я другого не понимаю: весь остальной С++ вы уже выучили? Что вам этот constexpr так упёрся? Он нужен раз в 10 лет.
Офигеть. Ладно, спасибо )
И если шаблон убрать тоже call может быть. Тут дело в другом - в детекте компилятора
Да, весь остальной C++ я уже выучил
Киррилл, можно, если что, в сложных ситуациях я буду к тебе образаться?
Без проблем! ) 😄
Обсуждают сегодня