Имеет ли перегруженный побитовый оператор или оператор ('|') четко определенный порядок вычисления? - PullRequest
0 голосов
/ 28 ноября 2018

Если мой класс C ++ перегружен оператором побитового ИЛИ (|), гарантирует ли спецификация языка C ++, что аргументы, переданные серии вызовов этого оператора, будут оцениваться слева направо?Или реализация порядка оценки определяется (или не определяется)?

(встроенный оператор IIRC C ++ | имеет порядок оценки, определенный реализацией, но, возможно, он отличается, когда операторбыла перегружена для класса?)

Ниже приведена программа, которая иллюстрирует то, что я спрашиваю: гарантированно ли эта программа распечатывает 0 1 2 3 4 (как это происходит на Mac, на котором я сейчас сижу)или он может по закону распечатать 4 3 2 1 0 (или какой-либо другой порядок) в определенных условиях?

#include <iostream>

class mytype_t
{
public:
   mytype_t(int v) : _val(v) {/* empty */}

   mytype_t operator | (const mytype_t & rhs) const {return (_val | rhs._val);}

private:
   int _val;
};

mytype_t func(int v)
{
   std::cout << v << std::endl;
   return mytype_t(v);
}

int main(int, char **)
{
   mytype_t x = func(0) | func(1) | func(2) | func(3) | func(4);
   return 0;
}

1 Ответ

0 голосов
/ 28 ноября 2018

Если встроенный оператор предписывает определенную последовательность, аргументы оцениваются в том же порядке и для перегрузки.Вот соответствующий параграф (от n4659, черновик C ++ 17), выделенный мной:

[over.match.oper]

2 Если любой из операндов имеет тип, который является классом или перечислением, может быть объявлена ​​пользовательская функция оператора, которая реализует этот оператор, или может потребоваться пользовательское преобразование для преобразования операнда в тип, который являетсяподходит для встроенного оператора.В этом случае разрешение перегрузки используется для определения, какую операторную функцию или встроенный оператор следует вызывать для реализации оператора.Поэтому запись оператора сначала преобразуется в эквивалентную запись вызова функции, как показано в Таблице 12 (где @ обозначает один из операторов, охватываемых указанным подпунктом). Однако операнды упорядочены в порядке, установленном для встроенного оператора (пункт [expr]).

Так что нет, перегруженный operator| не будет иметьчетко определенный порядок оценки, потому что встроенный не имеет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...