(这个问题的灵感来自How can I generate a compiler error to prevent certain VALUE (not type) to go into the function?)
比方说,我们有一个单参数foo
,语义上定义为
int foo(int arg) {
int* parg;
if (arg != 5) {
parg = &arg;
}
return *parg;
}
上面的整个代码用于说明一个简单的想法 - 函数返回它自己的参数,除非参数等于 5,在这种情况下,行为是未定义的。
现在,挑战 - 以这样的方式修改函数,如果它的参数在编译时已知,则应该生成编译器诊断(警告或错误),如果不是,则行为在运行时保持未定义。解决方案可能依赖于编译器,只要它在四大编译器之一中可用。
以下是一些无法解决问题的潜在路线:
- 使函数成为将其参数作为模板参数的模板 - 这并不能解决问题,因为它使函数不符合运行时参数的条件
- 制作函数 a
constexpr
- 这并不能解决问题,因为即使编译器看到未定义的行为,它们也不会在我的测试中产生诊断 - 相反,gcc 会插入ud2
指令,这不是我想要的。