Constexpr就是这种正确的行为
Constexpr is this correct behaviour?
本文关键字:Constexpr 更新时间:2023-10-16
我不确定这是正确的行为。所以我之前没有使用过constexpr,我想确保我没有误解规范的某些内容。按照MSDN提到的方式进行测试。如果我在函数中设置了一个断点,它被跳过,那么它在编译时就会被求值。行为不正常吗?
https://msdn.microsoft.com/en-us/library/dn956974.aspx- 它似乎只与优化周期工作。
- 只有当我将值设置为constexpr变量或在与输入变量无关的特定用例中才有效。
由于某些原因,这行得通
constexpr unsigned int factorial(unsigned int n)
{
return n <= 1 ? 1 : n*factorial(n - 1);
}
constexpr unsigned int value = factorial(5);
std::cout << value << std::endl;
但是它会在运行时运行
constexpr unsigned int factorial(unsigned int n)
{
return n <= 1 ? 1 : n*factorial(n - 1);
}
std::cout << factorial(5) << std::endl;
似乎有点不方便,不得不做一个constexpr变量。它似乎在其他一些特殊情况下也有效。
switch (fnv1a("Hello"))
{
case fnv1a("GoodBye"):
std::cout << "GoodBye" << std::endl;
break;
case fnv1a("Hello"):
std::cout << "Hello" << std::endl;
break;
default:
break;
}
此case将case值初始化为常量,但switch语句中的调用不会计算为constexpr,而是在运行时运行。
由于某种原因,相等操作符似乎也是有效的。本例仅为动态值调用一次fnv1a。
void isValue(const char* str)
{
if (fnv1a(str) == fnv1a("Hello"));
std::cout << "Found it!" << std::endl;
}
我知道MSVC在遵从性方面有一些问题,但是基于用例而不是输入常量的行为对我来说似乎很奇怪。
您观察到的行为是正确的。constexpr
函数只需要在编译时对常量表达式调用。这包括constexpr
函数的返回值用作constexpr
变量的初始化项,或用作非类型模板形参的值的情况。
在所有其他情况下,编译器不需要在编译时对函数求值。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- constexpr构造函数需要常量成员函数时出现问题
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- C++constexpr实现差异
- 添加静态constexpr成员是否会更改结构/类的内存映射
- C++中的Constexpr迭代程序