C ++强制非constexpr上下文

时间:2019-01-19 10:31:12

标签: c++ c++11 metaprogramming constexpr

我有一些用constexpr声明符声明的函数,并且我已经测试过它们是否在单元测试中的编译时进行评估。

现在,我想在单元测试中使用消毒剂,以发现更多问题。但是因为我的很多函数都是用constexpr指定的,所以我不确定该怎么做,因为如果在编译时对函数进行了评估,则消毒剂是否有用?

是否有某种方法可以强制constexpr函数不被评估为编译时间。 或者您还有其他建议吗?

2 个答案:

答案 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的情况下计算出来的(因为aconstexpr,而0是文字),并且是在运行时初始化b时计算出来的(因为c表达式中不能使用constexpr)。

您还可以验证写作

int c = 1;

constexpr auto a = getVal(c);

由于a必须初始化编译时但无法计算getVal(c),因此会出现编译错误。

答案 1 :(得分:0)

  

是否有某种方法可以使constexpr函数不被评估为编译时间。

constexpr告诉编译器该函数及其调用的任何内容都应该安全地进行评估。您无法做的一件事,例如newdelete。对constexpr的限制意味着可以隐式地避免使用洗手液来捕获的许多陷阱。

  

或者您还有其他建议吗?

消毒剂仍然有用。例如,您可能调用了未定义的行为。仅仅因为您的许多代码是constexpr,并不意味着不存在的那些位也隐含着安全性。