gpt4 book ai didi

c++ - 自然算术 C++ 总是返回 1

转载 作者:行者123 更新时间:2023-11-30 03:23:02 24 4
gpt4 key购买 nike

我正在尝试用 C++ 实现自然数,这是我目前的代码(O() 是 0(零)数,S(Nat) 是后继函数)。

// Peano arithmetic C++
// Null element
struct O{
explicit operator const unsigned int() const { return 0; }
};

// Successor function
struct S {
unsigned int val;
explicit operator const unsigned int() const {
// Boundary check
std::cout << "Incremented once" << std::endl;
if (this->val < UINT_MAX) {
return this->val + 1;
}
// Don't wrap around, hit the ceiling and stay there
return this->val;
}
S(const unsigned int a) {
this->val = a;
}
// Constructor
S(const O& zero) {
this->val = 0;
}
S(const S& s) {
this->val = static_cast<const unsigned int>(s);
}
};

// Nat
using Nat = std::variant<O, S>;

int main() {
std::cout << static_cast<const unsigned int>(S(O())) << std::endl;
std::cout << static_cast<const unsigned int>(S(S(O()))) << std::endl;
return 0;
}

我期望的是 static_cast 到 unsigned 给我 1, 2。我得到的实际上是 1, 1!

最佳答案

S(const S& s)是拷贝构造函数,允许编译器elide calls在某些情况下复制构造函数。这是 C++14 及更低版本中的可选优化,在 C++17 中是必需的。您可以通过在此构造函数中放置一个打印语句来验证是否发生了这种情况,该构造函数不会打印任何内容。

在这种情况下,它将使表达式 S(S(O())) 等同于 S(O())

因此,这种做事方式在这里行不通。您可以将 S 改为一个函数,它可以返回一个整数(使其变得微不足道),或者如果您希望保留与此处代码类似的内容,则可以返回某个对象。

关于c++ - 自然算术 C++ 总是返回 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50672001/

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