gpt4 book ai didi

c++ - 如何在c++ 20中将指针变量与consteval一起使用?

转载 作者:行者123 更新时间:2023-12-02 09:49:28 26 4
gpt4 key购买 nike

我想在consteval表达式中使用指针变量。像这样:

consteval int foo(int i) { return i * i; }
consteval int bar(int* i) { return (*i) * (*i); }

int main() {
const int const_int{8};
const int* const_int_ptr{&const_int};

constexpr int i = foo(const_int); //fine
constexpr int m = bar(const_int_ptr); // does not compile

return 0;
}

您可以 see online at Godbolt不编译 bar的代码。如何修复 bar的代码?

最佳答案

首先,您只是遇到类型错误。 bar()接受int*,但const_int_ptrint const*

解决此问题后,为了使用指向常量表达式的指针,指针及其引用的对象也必须是常量表达式。这些都不是真的。如果将指针本身设置为constexpr,则会得到一个更加本地化的错误:

<source>:7:38: error: '& const_int' is not a constant expression
7 | constexpr const int* const_int_ptr{&const_int};
| ^~~~~~~~~~

为了做到这一点,必须知道该地址-它必须具有静态存储持续时间。这里的特定规则是 [expr.const]/11:

if the value is of pointer type, it contains the address of an object with static storage duration, the address past the end of such an object ([expr.add]), the address of a non-immediate function, or a null pointer value,



您有一个指向 const_int的指针,该指针没有静态存储持续时间,因此不能在常量表达式中使用。将 const_int设置为 static constexpr变量,将指针本身也设置为 constexpr(并修复 bar的签名),然后您就可以开始了: demo

关于c++ - 如何在c++ 20中将指针变量与consteval一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61423628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com