gpt4 book ai didi

c++ - 为什么 std::max 由 const 返回?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:55 24 4
gpt4 key购买 nike

我想找到最大值 Foo 并对其调用 inc(),这是一个非常量方法。当然,在寻找最大值时,我不想创建任何拷贝或移动,即我不想要 Foo foo = std::max(foo1, foo2)。我尝试编写自己的 max,但 g++ 坚持要我返回一个 const&。

#include <iostream>

class Foo
{
public:
Foo(int x) : x_(x) { std::cout << "const" << std::endl; }
Foo(const Foo& foo) : x_(foo.x_) { std::cout << "copy const" << std::endl; }
Foo(Foo&& foo) : x_(foo.x_) { std::cout << "move const" << std::endl; }
bool operator< (const Foo& foo) const { return x_ < foo.x_; }
bool operator> (const Foo& foo) const { return x_ > foo.x_; }
void inc() { ++x_; }
int x_;
};

/*
* Doesn't compile. Must return const T& or must accept non-const T&
*
template<typename T>
inline T& my_max(const T& f1, const T& f2)
{
return f1 > f2 ? f1 : f2;
}
*
*/

int main()
{
Foo foo1(6);
Foo foo2(7);
Foo& foo = std::max(foo1, foo2); //Doesn't compile. Must be const Foo&. But then next line fails
foo.inc();
std::cout << foo.x_ << std::endl;
return 0;
}

最佳答案

这里有 2 个问题:

  1. 结果中缺少 const 限定符
  2. 返回对 const 引用参数的引用是危险的

在这种情况下:

Foo& foo = std::max(Foo(6), Foo(7));

编译器会在函数调用之前为参数构造临时对象,并在函数调用之后销毁它们——所以你最终会引用垃圾。当然,如果您始终使用现有对象,它会起作用 - 但很容易忘记这些限制。

您可以从参数中删除 const,这将解决这两个问题,而且您应该没问题,因为您打算无论如何都要修改对象。

关于c++ - 为什么 std::max 由 const 返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27900079/

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