Да, вы получаете вызов функции.Но вызовы функций могут быть скомпилированы с постоянными выражениями времени из-за constexpr
буквальных операторных функций.
Например, см. this .В качестве другого примера, чтобы показать расширенную форму constexpr
вычислений, разрешенных FDIS, чтобы иметь литералы времени компиляции base-26, вы можете
typedef unsigned long long ull;
constexpr ull base26(char const *s, ull ps) {
return (*s && !(*s >= 'a' && *s <= 'z')) ? throw "bad char!" :
(!*s ? ps : base26(s + 1, (ps * 26ULL) + (*s - 'a')));
}
constexpr ull operator "" _26(char const *s, std::size_t len) {
return base26(s, 0);
}
Saying "bcd-"_26
вычислить выражение броска, итаким образом, возвращаемое значение становится непостоянным.В свою очередь, это приводит к тому, что любое использование "bcd-"_26
в качестве константного выражения становится неправильным, а любое непостоянное использование - кидается во время выполнения.Разрешенная форма "bcd"_26
соответствует константному выражению соответствующего вычисленного значения.
Обратите внимание, что чтение из строковых литералов явно не разрешено FDIS, однако это не представляет проблемы, и GCC поддерживает это (ссылка на символ lvalue является константным выражением, а значение символа известно во время компиляции).ИМО, если один щуриться, можно читать FDIS, как будто это разрешено делать.
Затем мы получили шаблонный пользовательский литерал, который никогда не будет определен в стандарте AFAICS (т. Е. Пример не приводится, пожалуйста, докажите, что я не прав)
Обработка литералов как вызова шаблонов литеральных операторов определена в 2.14.8.На 13.5.8 вы найдете больше примеров, подробно описывающих шаблоны функций / функций литерального оператора.
Эта функция каким-то волшебным образом вызывается во время компиляции или все еще во время выполнения?
Ключевое слово - подстановка вызова функции .Смотри 7.1.5.