gpt4 book ai didi

c++ - 不能使函数接受右值和左值引用

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

class Vec3{

private:
float x, y, z;

public:
Vec3() = default;
Vec3(const float c) {x = c; y = c; z = c;}

static Vec3& normalize(Vec3& v) {/* normalize */ return v;}

};

Vec3 aaa = Vec3( 1.0f);
Vec3 bbb = Vec3::normalize( Vec3( 1.0f));
Vec3 ccc = Vec3::normalize( aaa);

我想编写将 vector 作为参数的函数,对它们进行一些处理并将它们作为引用返回。

在上面的代码中,bbb 将无法编译,因为它是对右值的非常量引用。我无法将其设为 const,因为 normalize 需要修改对象。如果我让函数接受右值引用 (Vec3&& v),那么 ccc 将无法编译,因为 aaa 是一个左值。我可以在不必编写两个版本的 normalize 的情况下完成这项工作吗?

(我对右值和左值引用感到困惑,我不明白为什么 someFunc(const Vec3& v) 会接受右值和左值,而非 const 版本不会t.)

最佳答案

你可以用一点点开销来做到这一点。您不必编写规范化代码两次,但您需要以不同方式处理返回,因为您不想返回对右值的引用。

如果你有类似的东西

static  Vec3& normalize(Vec3& v) {/* normalize */ return v;}
static Vec3 normalize(Vec3&& v) { return normalize(v);}
^ v is a lvalue here

现在您可以将临时对象转发到左值引用版本,然后按值返回,这样您就不会尝试引用可能不再存在的对象。

关于c++ - 不能使函数接受右值和左值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309889/

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