gpt4 book ai didi

c++ - constexpr 链表 - 从 const X* 到 X* 的无效转换

转载 作者:太空宇宙 更新时间:2023-11-04 16:00:44 24 4
gpt4 key购买 nike

这是我尝试创建一个简单的 constexpr 链表 -

struct Node
{
constexpr Node(const int n, Node const* next = nullptr)
: value(n), next(next) {}
constexpr Node push(const int n) const { return Node(n, this); }

int value;
Node const* next;
};

constexpr auto getSum(Node n) {
int sum = 0;
Node *current = &n;
while(current != nullptr) {
sum += current->value;
current = current->next;
}
return sum;
}

int main() {
constexpr Node a(0);
a.push(1);
a.push(22);
constexpr auto result = getSum(a);
return result;
}

编译这个程序,出现如下错误

prog.cc: In function 'constexpr auto getSum(Node)':
prog.cc:16:28: error: invalid conversion from 'const Node*' to 'Node*' [-fpermissive]
current = current->next;
~~~~~~~~~^~~~
prog.cc: In function 'int main()':
prog.cc:25:35: in constexpr expansion of 'getSum(a)'
prog.cc:16:28: error: conversion of 'const Node*' null pointer to 'Node*' is not a constant expression

我应该如何继续解决这个问题并生成这样的链表?这是 Wandbox Link在线观看执行情况。

最佳答案

即时错误很容易修复:

  Node const *current = &n;
// ^^^^^

投诉是 current = current->next; 正在将 Node const* 分配给 Node *,所以不要这样做。

这样做将使您的程序编译但打印 0,因为 push 都不会调用修改过的 a。您也不能将 push 的结果存储为 constexpr,因为自动局部变量 a 的地址不是常量表达式.

但是,您可以形成临时节点的链表并立即使用它:

constexpr auto result = getSum(a.push(1).push(22).push(19)); // OK, 42

关于c++ - constexpr 链表 - 从 const X* 到 X* 的无效转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45013903/

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