Ошибки, баги, вопросы - страница 1705

 
Комбинатор:
Объясните
this[0] здесь - rvalue.
 
Sergei Vladimirov:
this[0] здесь - rvalue.

Вот это и непонятно.

Если присвоение работает в первом случае, по логике оно должно работать и во втором. Потому что в первом случае указателю присваивается тот же rvalue, но оператор потом работает!

Это конечно исключительно мое мнение. Но разобраться охота.

 
Комбинатор:

Вот это и непонятно.

Мне тоже непонятно. )) Upd. Уже понятно. 

Если присвоение работает в первом случае, по логике оно должно работать и во втором. Потому что в первом случае указателю присваивается тот же rvalue, но оператор потом работает!

Это конечно исключительно мое мнение. Но разобраться охота. 

rvalue только и может, что присваиваться левостороннему значению или быть временной константой.

Вот это в плюсах работает:

class A
{
public:
        int m[10];

        int& operator [] (const int i)
        {
                return((m[i]));
        }
};

int main()
{
        A oA;
        oA[2] = 5;
}

 

А вот это - нет.

class A
{
public:
        int* m[10];

        int* operator [] (const int i)
        {
                return((m[i]));
        }
};

int main()
{
        A oA;
        oA[2] = new int;    // error C2106: =: левый операнд должен быть левосторонним значением
}
 
Sergei Vladimirov:

А вот это - нет, и что-то не могу догнать, в чём отличие:

Если добавите ссылку к указателю будет работать. Или двойной указатель.
 
Комбинатор:
Если добавите ссылку к указателю будет работать. Или двойной указатель.
Не понял, какую ссылку, куда?
 
Тьфу ты, млин. Во втором примере operator[] возвращает адрес i-го элемента - естественно, он не может быть изменён. Затупил под вечер.
 

Ой, торможу, второй пример вообще неправильный

Поэтому логично что:

error: invalid initialization of non-const reference of type 'int*&' from an rvalue of type 'int*'

 
Комбинатор:

Ой, торможу, второй пример вообще неправильный

Поэтому логично что:

error: invalid initialization of non-const reference of type 'int*&' from an rvalue of type 'int*'

Да, я выше уже написал об этом. Я изменил второй пример, но он всё равно не работает. Оператор же возвращает значение, т.е. копию. Это ж надо было так всем троим затупить, а! ))
 
Sergei Vladimirov:
Это ж надо было так всем троим затупить, а! ))
Так почему тогда первый кусок примера fxsaber пашет?
 
Комбинатор:
Так почему тогда первый кусок примера fxsaber пашет?

А почему не должен-то? У него выражение this[0] возвращает указатель. Вот то же самое в другом виде:

int a;

int* Func(int& i)
{
   return(&i);
}

int* p = Func(a);   // работает, то же что A* a = this[0]
Func(a) = new int;  // не работает, то же, что и this[0] = new int