(этот вопрос был вдохновлен тем, как я могу сгенерировать ошибку компиляции, чтобы предотвратить использование определенного VALUE (не типа) в функции?)
Допустим, у нас есть foo
с одним аргументом, семантически определенный как
int foo(int arg) {
int* parg;
if (arg != 5) {
parg = &arg;
}
return *parg;
}
Весь приведенный выше код используется для иллюстрации простой идеи - функция возвращает собственный аргумент, если аргумент не равен 5, в этом случае поведение не определено.
Теперь задача - изменить функцию таким образом, чтобы, если ее аргумент был известен во время компиляции, генерировалась диагностика компилятора (предупреждение или ошибка), а если нет, поведение оставалось неопределенным во время выполнения. Решение может зависеть от компилятора, если оно доступно в одном из 4 больших компиляторов.
Вот некоторые потенциальные маршруты, которые не решают проблему:
- Делать функцию шаблоном, который принимает ее аргумент в качестве параметра шаблона - это не решает проблему, потому что делает функцию непригодной для аргументов времени выполнения
- Создание функции
constexpr
- это не решает проблему, потому что даже когда компиляторы видят неопределенное поведение, они не производят диагностику в моих тестах - вместо этого, gcc вставляет инструкциюud2
, а это не то, что мне нужно.