2016-05-05 13 views
1

Я создал класс Array, который содержит целочисленный массив. Из основной функции я пытаюсь получить элемент массива в массиве с помощью [], как это делается для массивов, объявленных в main. Я перегрузил оператор [], как в следующем коде; первая функция возвращает Левое и второй в RValue (Конструкторы и другие функции-члены не показаны.)Перегрузка оператора C++ [] для lvalue и rvalue

#include <iostream> 
using namespace std; 

class Array { 
public: 
    int& operator[] (const int index) 
    { 
     return a[index]; 
    } 
    int operator[] (const int index) const 
    { 
     return a[index]; 
    } 

private: 
    int* a; 
} 

Однако при попытке вызвать эти две функции из главной, только первая функция доступна, даже если переменная не используется как lvalue. Я не вижу смысла создавать отдельную функцию для rvalue, если все можно позаботиться только с помощью функции lvalue.

Следующий код является основной функцией я (оператор < < соответствующим перегружена.):

#include "array.h" 
#include <iostream> 
using namespace std; 

int main() { 
    Array array; 
    array[3] = 5;    // lvalue function called 
    cout << array[3] << endl; // lvalue function called 
    array[4] = array[3]   // lvalue function called for both 
} 

Есть ли способ, я могу вызвать функцию RValue? Нужно ли также определять функции как для lvalue, так и для rvalue?

+0

Операторы, вероятно, должны быть объявлены как возвращающие 'int &' и 'const int &', а не 'Array'. –

+0

Да, вы правы. My bad – HelperKing

ответ

6

Вторая функция является const member function и она будет называться, если у вас есть const экземпляра:

const Array array; 
cout << array[3] << endl; // rvalue function called 

Это не принято называть это «именующее выражение» и «RValue» функцию. И вы можете определить константу, чтобы вернуть ссылку на константу, если хотите.

+0

Функция const будет вызываться, но результат не может быть назначен в этом примере. – doug

 Смежные вопросы

  • Нет связанных вопросов^_^