Чтобы быть более точным, я хотел бы услышать, какие из следующих утверждений цитируемой статьи являются правильными:
- Непосредственная функция видна только во время компиляции (и не можетоценивается во время выполнения)
- Символы не выдаются для немедленной функции
- Инструменты, такие как отладчики, не смогут отображать немедленную функцию
Почти ни один из них не является ответом, который может дать стандарт C ++. Стандарт не определяет «символы» или то, что инструменты могут показать. Что касается стандарта, то почти все они являются выбором дилера.
Действительно, даже вопрос «время компиляции» и «время выполнения» - это то, с чем стандарт не имеет дела. Единственный вопрос, касающийся стандарта, заключается в том, является ли что-то постоянным выражением. Вызов функции constexpr
может создать постоянное выражение в зависимости от его параметров. Вызов функции consteval
способом, который не производит константное выражение, имеет форму il.
Тот, который стандарт определяет , определяет то, что "видно". Хотя дело не в «времени компиляции». В текущем проекте C ++ 20 есть ряд операторов, которые запрещают большинству функций иметь дело с указателями / ссылками на непосредственные функции. Например, N4835 (самый последний рабочий проект C ++ 20) в [expr.prim.id] / 3:
Идентификационное выражение, обозначающее непосредственную функцию, должно появляться только
Так что, если вы не используете непосредственную функцию или не используете имя непосредственной функции для вызова другой непосредственной функции (передавая указатель / ссылку на функцию), то вы не можете назвать непосредственную функцию. И вы не можете получить указатель / ссылку на функцию, не назвав ее.
Этот и другие операторы в спецификации (например, указывает на непосредственную функцию, не являющуюся действительным результатом константных выражений )по сути, делает невозможным утечку указателя / ссылки на непосредственную функцию за пределы константных выражений.
Таким образом, утверждения о видимости непосредственных функций в некоторой степени верны. Символы могут передаваться для непосредственных функций, но вы не можете использовать непосредственные функции таким образом, чтобы препятствовал реализации в отбрасывании указанных символов.
И это в основном вещьс consteval
. Он не использует стандартный язык для обеспечения того, что должно произойти. Он использует стандартный язык, чтобы сделать невозможным использование функции таким образом, чтобы предотвратил эти вещи. Поэтому разумнее сказать:
Вы не можете использовать немедленную функцию таким образом, чтобы компилятор не мог ее выполнить во время компиляции.
Вы не можете использовать непосредственную функцию так, чтобы компилятор не отбрасывал символы для нее.
Вы не можете использовать немедленную функцию таким образом, чтобы заставить отладчики иметь возможностьчтобы увидеть их.
Ожидается, что от этого зависит качество реализации.
Следует также отметить, что отладочные сборки предназначены для ... отладки. Для продвинутых инструментов компилятора было бы вполне разумно отлаживать код, который генерирует константные выражения. Таким образом, отладчик, который может видеть выполнение немедленных функций, является совершенно желательной технологией. Это становится тем более по мере того, как код времени компиляции становится все более сложным.