+3
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
template <typename T>
void f() {
if constexpr (std::is_arithmetic_v<T>)
// ...
else
static_assert(false, "Must be arithmetic"); // ill-formed: invalid for every T
}
// The common workaround for such a catch-all statement is a type-dependent expression that is always false:
template<class T> struct dependent_false : std::false_type {};
template <typename T>
void f() {
if constexpr (std::is_arithmetic_v<T>)
// ...
else
static_assert(dependent_false<T>::value, "Must be arithmetic"); // ok
}
То есть «static_assert(false)» в шаблоне — это UB. Чтобы оно было не UB и можно было спокойно отключать ненужные специализации — надо городить ёбанный костыль. Пиздец. Почему стандартизаторы не могут просто взять и сделать что-то удобное? Что-то, для чего не требуется городить по десятку костылешаблонов, заставляющих его работать? Что-то без ёбанной явной специализации для bool? Почему любой высер крестокомитета обязательно должен быть максимально сложным, вербозным, неочевидным говном с кучей подводных камней и UB?
Запостил: gost,
06 Января 2020
gost 06.01.2020 22:27 # +1
HoBorogHuu_nemyx 06.01.2020 23:02 # +1
nemywok_Ha_naJlO4KE 06.01.2020 23:47 # −1
KOHCOjlbHblu_nemyx 06.01.2020 23:53 # 0
nemywok_Ha_naJlO4KE 06.01.2020 23:54 # −1
nemywok_Ha_naJlO4KE 06.01.2020 23:47 # −1
Stallman 07.01.2020 14:00 # +1
inkanus_gray 07.01.2020 15:06 # −1
AnalBoy 15.01.2020 15:41 # 0
bootcamp_dropout 07.01.2020 15:08 # 0
Нихуя не понял на этом сайте https://stackoverflow.com/questions/14637356/static-assert-fails-compilation-even-though-template-function-is-called-nowhere
Получается в с++ есть просто константные выражения, а есть константные выражения которые вычисляются еще раньше?
mvngr 15.01.2020 12:49 # 0
bormand 07.01.2020 16:49 # 0
З.Ы. Почему просто не написать static_assert(std::is_arithmetic_v<T>, "Must be arithmetic") без всяких там constexpr if'ов?
AnalBoy 07.01.2020 20:18 # −4
Fike 08.01.2020 19:43 # 0
bormand 08.01.2020 22:43 # 0
gost 08.01.2020 22:55 # 0
Stallman 08.01.2020 23:07 # 0
gost 08.01.2020 23:11 # +1
Stallman 08.01.2020 23:41 # 0
Fike 09.01.2020 01:24 # 0
gost 09.01.2020 13:47 # +3
https://i.imgur.com/TM58HLT.png
bormand 09.01.2020 14:20 # +1
Я в круги давно не играл толком, на самом деле. Изредка захожу по фану старые мапки вспомнить...
AnalBoy 09.01.2020 15:14 # 0
adrnin 09.01.2020 17:21 # +1
6arPoBblu_nemyx 09.01.2020 18:15 # +1
AnalBoy 09.01.2020 18:18 # 0
Парня бы себе лучше завёл.
1024-- 09.01.2020 20:24 # +2
inkanus_gray 11.01.2020 19:12 # 0
3.14159265 11.01.2020 21:47 # +1
gost 07.01.2020 20:26 # +3
Тут можно написать, да, но это просто пример такого поведения. У меня в калькуляторе был более сложный случай:
Сюда бы идеально подошло static_assert(false), но увы, приходится городить тупые костыли. Собственно, я об этом поведении только вчера и узнал, поэтому и наговнокодил такой вот багор.
Кстати, если этой специализации не делать — получается UB, и в «Visual Studio», например, успешно конпелируется деление на 0 (получается 0).
AnalBoy 07.01.2020 20:43 # −1