C++,在函数中采用const左值和右值引用

标签 c++ rvalue-reference lvalue

我有一些方法需要让他们能够通过 const 左值(它将被复制的地方)和右值引用(为了速度)获取变量

struct Object {
    ...
    Object(Object&& o) { ... }
    Object(const Object& o) { ... }
    ...
};

...

struct SomeClass {
    ...
    Object arr[7];

    void copy(int pos,const Object& o) { arr[pos] = o; }
    void copy(int pos,Object&& o) { arr[pos] = o; }
    ...
};

因此,两个复制方法在 SomeClass 中是完全相同的。唯一的区别是,一个对象作为常量传递,它将被复制,而另一个对象作为右值引用传递以供快速复制使用。

这两个方法的代码完全相同。

现在,在上面的示例中并没有那么悲惨,但是,我有稍微大一点的方法,大约 9-15 行。显然,解决方法是像此处那样复制它们,但感觉不对。

如何重用复制方法的代码?

最佳答案

通用引用和 std::forward让您实现完美转发。这是修改后的 copy :

template <typename T>
void copy(int pos, T&& o) {arr[pos] = std::forward<T>(o);}

如果您担心从其他类型到 Object 的可能隐式转换, 您还可以添加 static_assertcopy 的正文中.如果传递左值 Objectcopy , T将被推断为 Object& . std::forward<Object&>返回一个引用。因此,将选择复制赋值重载。如果传递右值 Objectcopy , T将被推断为 Object . std::forward<Object&>返回 Object&& .自 std::forward<Object>(o)也是右值,移动赋值运算符将被选中。

关于C++,在函数中采用const左值和右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24795337/

相关文章:

c++ - POCO websocket 异常

c++ - 返回指向 protected 内部类元素的指针

c++ - 右值引用的类型变化

c++ - 将局部变量命名为右值引用有什么意义吗?

C++ "move from"容器

c - 为什么++variable 在 C 中不被视为左值?

c - 这些C指针操作会不会出问题?

c++ - 使用可变函数参数泛化 is_detected

c++ - C++ 中的空 std::shared_ptr 和空 std::shared_ptr 有什么区别?

C++ 传递 vector (左值到右值)