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函数,除非它们用于需要编译时常量的上下文中。