Передача нескольких аргументов оператору [] - PullRequest
0 голосов
/ 11 сентября 2018

Хотя я и не знал, что вы не можете перегрузить operator[] в C ++, чтобы принять более одного аргумента, я случайно натолкнулся на утверждение, которое, к моему удивлению, оказалось верным:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> numbers{1, 2, 3, 4};

    int i = 0;
    std::cout << numbers[i++,i+=1,i=1,i+1] << std::endl;
    return 0;
}

Может ли кто-нибудь объяснить, есть ли польза от передачи нескольких выражений в operator[]?

скомпилировано с mingw g ++ 4.8.1 с -std = c ++ 11

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Это то, что может работать в интерпретируемых языках, таких как Python, но не в C ++.

В этом случае вы должны связать их с numbers перед

...<<numbers[i-1]<<number[i]<<...

Постарайтесь построить свой дизайн вокруг этого ограничения.

0 голосов
/ 11 сентября 2018

Вы не передаете несколько аргументов перегруженному оператору, а вместо этого используете оператор запятой для оценки одного параметра функции. Это не приносит никакой пользы, кроме как сбивать с толку коллег, которые вам не нравятся. Заявление

numbers[i++,i+=1,i=1,i+1]

оценивает i++, затем i += 1, затем i = 1, затем i + 1 и возвращает последнее вычисленное выражение, которое является 2.

Несмотря на допустимых вариантов использования для оператора запятой, это не один из них.

0 голосов
/ 11 сентября 2018

В C ++ запятая работает как разделитель и оператор.В данном конкретном случае он работает как оператор .

В выражении запятой E1, E2 вычисляется выражение E1, его результат отбрасывается (хотя, если он имеет тип класса, он не будет уничтожен до конца содержащего полного выражения), и его побочные эффекты будут завершены до того, как начнется оценка выражения E2 (обратите внимание, что пользовательский оператор не может гарантировать последовательность)(до C ++ 17).

Тип, значение и категория значения результата выражения с запятой - это в точности тип, значение и категория значения второго операнда, E2 .Если E2 является временным выражением (начиная с C ++ 17), результатом выражения является это временное выражение (начиная с C ++ 17).Если E2 является битовым полем, результатом является битовое поле.

То есть

numbers[i++,i+=1,i=1,i+1];

становится

numbers[i+1];
0 голосов
/ 11 сентября 2018

Помимо возможных побочных эффектов, никакой пользы нет, поскольку ваше выражение numbers[i++, i+=1, i=1, i+1] оценивается как numbers[i+1], что равно numbers[2] из-за того, как все работает при использовании оператора запятой. Мы можем утверждать, что это сбивает с толку, трудно читать и не приносит никакой пользы.

...