如何强制 constexpr 函数进行常量求值? [重复]

问题描述 投票:0回答:1

我最近编写了一些代码,将函数结果打印到

cout
。结果本可以在编译时评估,但事实并非如此:

#include <algorithm>
#include <iostream>

constexpr unsigned int gcd(unsigned int u, unsigned int v)
{
    // ...
}

int main() {
    std::cout << gcd(5, 3) << std::endl;
}

无论出于何种奇怪的原因,这都会编译为:(

clang -O3 -std=c++17
)

main:
    push    r14
    push    rbx
    push    rax
    mov     edi, 5
    mov     esi, 3
    call    gcd(unsigned int, unsigned int)
    mov     esi, eax
    ...

请参阅编译器资源管理器查看实例。

我希望编译器在编译时评估

gcd(5, 3)
,以避免在运行时浪费周期,这显然是可能的。我知道我可以执行以下操作:

int main() {
    constexpr unsigned g = gcd(5, 3); 
    std::cout << g << std::endl;
}

但是,这没有必要冗长。我想做的很简单:

#define CONSTEVAL(expression) // ...

int main() {
    std::cout << CONSTEVAL(gcd(5, 3)) << std::endl;
}

是否存在任何类型的内置编译器可以使这个

CONSTEVAL
宏成为可能?或者甚至更好 - 完全便携式的东西?

c++ macros c++17 constexpr compile-time
1个回答
4
投票

立即调用 lambda 表达式怎么样?

#define CONSTEVAL(...) []{ constexpr auto result = __VA_ARGS__; return result; }()

这实际上是一种生成

constexpr
变量来保存结果并计算变量值的方法。


这也可以通过模板来完成,但前提是该值可以作为模板参数传递:

template <auto V>
inline constexpr auto consteval_v = V;

用作

consteval_v<gcd(5, 3)>

© www.soinside.com 2019 - 2024. All rights reserved.