C++ C++;强制非constexpr上下文

C++ C++;强制非constexpr上下文,c++,c++11,metaprogramming,constexpr,C++,C++11,Metaprogramming,Constexpr,我有一些函数是用constepr说明符声明的,我已经测试过它们是在编译时在单元测试中进行评估的 现在我想在我的单元测试中使用消毒剂来发现更多的问题。但是因为我的很多函数都是用constexpr指定的,所以我不知道该怎么做,因为如果在编译时对一个函数求值,那么清理器是否无用 是否有某种方法可以强制编译时不对constepr函数求值。 或者你有其他的建议吗 有没有办法强制constexpr函数在编译时不进行求值 constexpr告诉编译器该函数及其调用的任何内容都应该是安全的。例如,有一件事你不能

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

现在我想在我的单元测试中使用消毒剂来发现更多的问题。但是因为我的很多函数都是用
constexpr
指定的,所以我不知道该怎么做,因为如果在编译时对一个函数求值,那么清理器是否无用

是否有某种方法可以强制编译时不对
constepr
函数求值。 或者你有其他的建议吗

有没有办法强制constexpr函数在编译时不进行求值

constexpr
告诉编译器该函数及其调用的任何内容都应该是安全的。例如,有一件事你不能做,那就是
new
delete
。对
constexpr
的限制意味着大量的缺陷都被隐式地避免了

或者你有其他的建议吗

消毒剂仍然有用。例如,您可以调用未定义的行为。仅仅因为你的很多代码是
constexpr
,并不意味着那些不是隐式的位也是安全的

有没有办法强制constexpr函数在编译时不进行求值[?]

如果可以修改
constexpr
函数,添加未使用的参数,则可以强制运行时计算传递运行时值

我是说。。。假设您有以下
constexpr
函数

constexpr int getVal ()
 { return 0; }
您可以按如下方式使用它

constexpr auto a = getVal();

auto b = getVal();
constexpr int getVal (int)
 { return 0; }
(忽略“原样”规则)您可以确定
getVal()
是在编译时初始化
a
时计算的,但不知道是在编译时初始化还是在运行时初始化
b

但是如果你修改函数如下

constexpr auto a = getVal();

auto b = getVal();
constexpr int getVal (int)
 { return 0; }
你可以写

   int c = 1;

   constexpr auto a = getVal(0);

   auto b = getVal(c);
现在,您可以确信
getVal()
是在编译时初始化
a
(因为
a
constepr
,而
0
是一个文本)计算的,这是在运行时初始化
b
(因为
c
不能在
constepr
表达式中使用)

您还可以验证是否已写入

int c = 1;

constexpr auto a = getVal(c);

出现编译错误是因为
a
必须在编译时初始化,但
getVal(c)
不能在编译时计算。

在未优化的版本(以及调试版本)中,GCC、Clang和MSVC似乎都不会在编译时计算constepr函数,除非它们用于需要编译时常量的上下文中。