개별 배열에 데이터를 저장하는 사용자 정의 컨테이너 Container
을 만들고 싶습니다. 그러나 컨테이너에 대한 반복 작업을 쉽게하기 위해 컨테이너에 'operator[]
'을 오버로드하여 '보기'를 제공하고 모든 컨테이너 변수를 실제 컨테이너에 대한 참조로 유지하는 단일 구조체 Value
을 반환합니다. 위의 코드는 지금까지 내가 말할 수있는 노력하고 있습니다,하지만 난 궁금하네요C++에서 rvalue 참조를 사용하여 불필요한 인스턴스를 피하는 방법
#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...
을 선언 할 때 (또는 심지어 구문 적으로 금지해도) 매달린 참조를 피할 수있는 방법이 있습니까?Value
인스턴스 직접operator[]
하지만 다른 방법에서 헬퍼 기능에 생성되지 않도록 1
EDIT I는 소스 코드에 작은 변화를 만들었다. 그게 아무것도 바꿀까요? 표시된대로 방법을 사용해야합니까, 아니면 여기에 std::move
/std::forward
을 사용해야합니까?
http://stackoverflow.com/questions/1116641/is-returning-by-rvalue-reference-more- 効率과 비슷합니다. –