我想创建一个自定义容器Container
,将数据存储在单个数组中。但是,为了便于对容器进行简单的迭代,我通过重载并返回一个包含所有容器变量作为对实际容器的引用operator[]
的单个结构来提供容器上的“视图”。Value
这是我到目前为止得到的:
#include <iostream>
using namespace std;
struct Value {
Value(int& data) : data_(data) { }
int& data() { return data_; }
int& data_;
};
struct Container {
Value makeValue(int i) { return Value(data_[i]); } // EDIT 1
Value&& operator[](int i) {
// return std::forward<Value>(Value(data_[i]));
return std::forward<Value>(makeValue(i)); // EDIT 1
}
int data_[5] = {1, 2, 3, 4, 5};
};
int main(int, char**)
{
// Create and output temporary
Container c;
cout << c[2].data() << endl; // Output: 3 - OK!
// Create, modify and output copy
Value v = c[2];
cout << v.data() << endl; // Output: 3 - OK!
v.data() = 8;
cout << v.data() << endl; // Output: 8 - OK!
// Create and output reference
Value&& vv = c[2];
cout << vv.data() << endl; // Output: 8 - OK, but weird:
// shouldn't this be a dangling reference?
cout << vv.data() << endl; // Output: 468319288 - Bad, but that's expected...
}
据我所知,上面的代码正在工作,但我想知道我是否在这里使用了最好的方法:
Value
如果我想避免不必要的复制,返回作为右值引用是否正确?- 使用是否
std::forward
正确?我应该使用std::move
(在这个例子中都可以使用)还是其他的东西? - 编译程序的输出在注释中说明。
Value&& vv...
当我声明(甚至在语法上禁止它)时,有什么方法可以避免悬空引用?
编辑 1
我对源代码做了一个小改动,以便Value
实例不是直接在operator[]
方法中创建,而是在另一个辅助函数中创建。那会改变什么吗?我应该使用makeValue(int i)
如图所示的方法还是需要在这里使用std::move
/ std::forward
?