cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +2, -6 Автор идеи: Игорь Шаповал

Разрешить перегрузку оператора ?:

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

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;
}
apolukhin commented 3 years ago

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

auto* ptr = foo();

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

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

Игорь Шаповал, 4 сентября 2018, 16:14 Я прочел, что уже предлагают в стандарт в виде проповзола

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

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

yndx-antoshkka, 4 сентября 2018, 17:11 Игорь Шаповал, в бумаге предлагают способы борьбы с вычислением обеих результатов выражения... Но я всё равно не в восторге от предложения.

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

Игорь Шаповал, 5 сентября 2018, 9:19 Этот автор если я не ошибаюсь добавил simd классы в Parallelizm TS 2. Я думаю он сможет довести дело до конца.

apolukhin commented 3 years ago

Идея прорабатывается в https://wg21.link/p0917