我有一些用constexpr
声明符声明的函数,并且我已经测试过它们是否在单元测试中的编译时进行评估。
现在,我想在单元测试中使用消毒剂,以发现更多问题。但是因为我的很多函数都是用constexpr
指定的,所以我不确定该怎么做,因为如果在编译时对函数进行了评估,则消毒剂是否有用?
是否有某种方法可以强制constexpr
函数不被评估为编译时间。
或者您还有其他建议吗?
答案 0 :(得分:1)
是否有某种方法可以使constexpr函数不被评估为编译时间[?]
如果可以修改constexpr
函数,添加未使用的参数,则可以强制运行时评估传递运行时值。
我的意思是……假设您具有以下constexpr
函数
constexpr int getVal ()
{ return 0; }
您可以按以下方式使用它
constexpr auto a = getVal();
auto b = getVal();
并且(忽略“原样”规则),您确定getVal()
是在编译时初始化a
的情况下计算的,但是您不知道它是在编译时还是在运行时计算的初始化b
。
但是如果您按如下方式修改功能
constexpr int getVal (int)
{ return 0; }
你可以写
int c = 1;
constexpr auto a = getVal(0);
auto b = getVal(c);
现在您可以确信getVal()
是在编译时初始化a
的情况下计算出来的(因为a
是constexpr
,而0
是文字),并且是在运行时初始化b
时计算出来的(因为c
表达式中不能使用constexpr
)。
您还可以验证写作
int c = 1;
constexpr auto a = getVal(c);
由于a
必须初始化编译时但无法计算getVal(c)
,因此会出现编译错误。
答案 1 :(得分:0)
是否有某种方法可以使constexpr函数不被评估为编译时间。
constexpr
告诉编译器该函数及其调用的任何内容都应该安全地进行评估。您无法做的一件事,例如new
或delete
。对constexpr
的限制意味着可以隐式地避免使用洗手液来捕获的许多陷阱。
或者您还有其他建议吗?
消毒剂仍然有用。例如,您可能调用了未定义的行为。仅仅因为您的许多代码是constexpr
,并不意味着不存在的那些位也隐含着安全性。