Перегрузка оператора ?:

Игорь Шаповал
Игорь Шаповал

В языке С++ можно перегружать операторы, кроме операторов ?: , :: , . Операторы :: , . понятно почему нельзя перегружать. А вот почему оператор ?: нельзя перегружать не понятно. Предлагаю добавить в стандарт перегрузку оператора ?:

 

struct dot {
   int x, y;
};

dot select(int value) {
   dot result;

   if (value == 0) {
      result = dot(1, 1);
    
      cout << "use dot: " << dot.x << " " << dot.y << endl;
   } else {
      result = dot(2, 2);
    
      cout << "use dot: " << dot.x << " " << dot.y << endl;
   }

   return result;
}

Можно было вот так:

struct dot {
private:
   int x, y;
public:
   friend dot operator?:(bool condition, const dot& left, const dot& right);
};

dot dot::operator?:(bool condition, const dot& left, const dot& right) {
   dot result;

   if (condition) {
      cout << "use left: " << left.x << " " << left.y << endl;
    
      result = left;
   } else {
      cout << "use right: " << right.x << " " << right.y << endl;
    
      result = right;
   }

   return result;
}

 

-2
рейтинг
4 комментария
yndx-antoshkka

У такой перегрузки будут те же неприятные последствия, что и при перегрузке операторов && ||. А именно - все выражения на вход будут считаться сразу, а не лениво. В итоге код с перегруженным оператором ?: ,удет приводить к краху приложения

auto* ptr = foo();

return ptr ? ptr->bar() : fallback();

В примере выше, ptr->bar() будет всегда выполняться.

yndx-antoshkka
Игорь Шаповал

Я прочел, что уже предлагают в стандарт в виде проповзола

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0917r1.pdf

yndx-antoshkka Что можете сказать? Есть шанс, что добавят в стандарт?

Игорь Шаповал
Обновлено 
yndx-antoshkka

Игорь Шаповал, в бумаге предлагают способы борьбы с вычислением обеих результатов выражения... Но я всё равно не в восторге от предложения.

Посмотрим, что скажет комитет по этому поводу :)

yndx-antoshkka
Игорь Шаповал

Этот автор если я не ошибаюсь добавил simd классы в Parallelizm TS 2. Я думаю он сможет довести дело до конца.

Игорь Шаповал
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения