- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
#include <iostream>
#include <stdexcept>
template<std::size_t N>
static int constexpr date_component(const char (&s)[N], int i, bool last, int max) {
return
(i + 2 + (last ? 0 : 1) >= N)
? throw std::logic_error("Too short date string") :
(!last && s[i + 2] != ':')
? throw std::logic_error("Cannot find delimiter") :
(s[i] < '0' || s[i] > '9' || s[i + 1] < '0' || s[i + 1] > '9')
? throw std::logic_error("Not a number") :
((s[i] - '0') * 10 + (s[i + 1] - '0') > max)
? throw std::logic_error("Too large number") :
(s[i] - '0') * 10 + (s[i + 1] - '0');
}
struct time {
int hour; int minute; int second;
template<std::size_t N>
constexpr time(const char (&datestr)[N]) :
hour(date_component(datestr, 0, false, 24)),
minute(date_component(datestr, 3, false, 60)),
second(date_component(datestr, 6, true, 60))
{}
};
struct time constexpr midnight("00:00:00");
struct time constexpr afternoon("12:00:00");
int main(int argc, char* argv[]) {
std::cout << "Midnight hour is " << midnight.hour << std::endl;
std::cout << "Afternoon hour is " << afternoon.hour << std::endl;
}
Dummy00001 03.04.2015 14:16 # 0
myaut 03.04.2015 15:00 # 0
guest 03.04.2015 15:01 # −4
Dummy00001 03.04.2015 16:05 # 0
roman-kashitsyn 03.04.2015 16:07 # +2
bormand 03.04.2015 16:08 # +2
P.S. gcc 4.9.1 - всё работает, собралось с ворнингом про сравнение знакового и беззнакового.
Dummy00001 03.04.2015 16:29 # 0
ты можешь в дизассемблере глянуть - функция есть или ее нет? или проще: строки "00:00:00" и "12:00:00" попали в объектник или нет?
roman-kashitsyn 03.04.2015 16:39 # +1
Dummy00001 03.04.2015 16:41 # 0
ЗЫ у нас тут встроенщину на С++ переводят. а в gcc 4.8 С++11 еще по умолчанию выключен. надо будет народу сказать -std добавить.
roman-kashitsyn 03.04.2015 17:58 # 0
guest 03.04.2015 18:06 # 0
Dummy00001 03.04.2015 18:19 # 0
bormand 03.04.2015 16:59 # 0
Не может. Если хоть одно ограничение на constexpr не выполнено - свалится с ошибкой компиляции.
А в дизасме смотреть - не айс. Компилятор и без constexpr выкинет всё это нахуй и оставит только вывод ответа...
roman-kashitsyn 03.04.2015 17:26 # +2
Вроде не совсем так. Например, если есть шаблонная constexpr функция, а ты в неё пихаешь не поды, то она просто превратится в рантайм-функцию.
bormand 03.04.2015 17:45 # 0
Хм.. надо попробовать.
roman-kashitsyn 03.04.2015 17:54 # +1
bormand 03.04.2015 21:24 # 0
Использовать constexpr функцию на не constexpr данных если не нужен constexpr результат вроде бы никто не запрещает, да. Чтобы 2 версии не копипастить.
bormand 03.04.2015 21:40 # 0
Dummy00001 03.04.2015 17:33 # 0
хочется верить.
> А в дизасме смотреть - не айс.
сам глянул. смотри коммент в низу. работает и на 4.8.2.
я не ожидал что компилер бросание исключение съест.
myaut 03.04.2015 17:41 # +1
Не совсем -- он просто не трогает эту ветку. Однако если вызвать ее явно так:
Получишь неочевидную ошибку:
(ну и т.д.)
ЧСХ, static_assert в constexpr не присунуть.
Dummy00001 03.04.2015 16:38 # 0