EgoRusMarch
@EgoRusMarch

C++. Ассоциативность перегруженных операторов?

Читаю:
Все операторы сохраняют свой приоритет и ассоциативность по умолчанию, и это не может быть изменено

Берем бинарный плюс (ассоциативность слева направо):
const ClassName operator+(const ClassName &) const;
first + second + third; => first.operator+(second.operator+(third));

Получается, что, если явно скобками не обозначить, то ассоциативность всегда будет справа налево, или я не прав?
Или всё-таки внутренне это будет так выглядеть: first.operator+(second).operator+(third)?
В сети не нашёл ответа.

P.S.: Первый вариант [first.operator+(second.operator+(third))] есть в книге Праты.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
В сети не нашёл ответа.

В каждом из разделов стандарта касающихся операторов написано в каком порядке группируются вызовы опреаторов в однородных выражениях (например).

Получается, что, если явно скобками не обозначить, то ассоциативность всегда будет справа налево, или я не прав?

Почти все операторы группируются слева направо, за исключением префиксных операторов и операторов присваивания (в том числе составных).

Пример

#include <string>
#include <iostream>

struct A
{
        std::string name;

        A(const std::string& _name): name(_name)
        {
        }

        A operator +(const A& other) const
        {
                std::cerr << name << " + " << other.name << std::endl;
                return A(std::string("{temporary from ") + name + " + " + other.name + "}");
        }
};

int main()
{
        A first("first"), second("second"), third("third");
        A r = first + second + third;
}

выводит
first + second
{temporary from first + second} + third
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы