【发布时间】:2018-12-26 14:53:24
【问题描述】:
(这个问题的灵感来自How can I generate a compilation 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,在这种情况下行为是未定义的。
现在,挑战 - 以这样的方式修改函数,如果它的参数在编译时已知,则应该生成编译器诊断(警告或错误),如果不是,则行为在运行时保持未定义。解决方案可以依赖于编译器,只要它在四大编译器之一中可用。
以下是一些无法解决问题的潜在路线:
- 使函数成为模板,将其参数作为模板参数 - 这并不能解决问题,因为它使函数不符合运行时参数的条件
- 使函数成为
constexpr- 这并不能解决问题,因为即使编译器看到未定义的行为,它们也不会在我的测试中产生诊断 - 相反,gcc 会插入ud2指令,这不是我想要的.
【问题讨论】:
-
出于好奇,为什么这个 Q 被赞成,而链接一个被反对?
-
@appleapple 因为这个 #1 是精心制定的,所以 #2 给了一个简短的足够的上下文,而 #3 定义了一个 precise (SMART) objective。
-
@YSC 好吧,这个问题没有显示任何研究工作;不清楚或没用。如果我必须投一个,我会投反对票。
-
@appleapple 你不必投一个,但如果你愿意,可以随意投。我想这是一个品味问题。我发现它很有用(我从未成功完成该任务,我认为如果有一个 API 可以通过编译器错误来生成与价值相关的合同会很好)。
-
@IłyaBursov - 不是重复的,建议的答案不能解决问题。
标签: c++