Войти
ФлеймФорумПрограммирование

[C++SNO] Safe Navigation Operator (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
13:06, 19 дек. 2013

kipar
Таки я правило не понял, с какого места продолжать выполнение, если облом? С того места, где в тексте точка с запятой заканчивает текущее выражение?


#16
13:07, 19 дек. 2013

TarasB
Ну да, я так понимаю со следующего оператора.

#17
13:14, 19 дек. 2013

я так понимаю вот это:

{if(bar(p?->x==10))printf("x==10\n");}
синтаксический сахар для вот этого кода:
if(p){
  if(bar(p->x==10)){
    printf("x==10\n");
  }
}
а вот это:
{foobar(pa?->x,pb?->y);}
синтаксический сахар для вот этого кода:
if(pa){if(pb){foobar(pa->x,pb->y);}}

но есть вопросы: хороший ли сахар? можно его реализовать?

что делать вот с таким кодом пока не понятно:

int&bar(int&x){return x;}
int main(){return [](foo*p)->int&{int&v=bar(p?->x);return v;}(nullptr);}
наверно надо его запретить.

ещё пара примеров:

//c SNO
int baz(foo*p){
  int y=5;
  int z=p?->x;
  printf("abc");
  y=z;
  return y;
}
//без SNO
int baz(foo*p){
  int y=5;
  if(p){
    int z=p->x;
    printf("abc");
    y=z;
    return y;
  }
  // проблема: и что тут возвращать из функции? предполагаемое решение: кинуть ошибку компиляции?
}

компилируемый пример:

//c SNO
int baz_v0(foo*p){
  int y=800;
  {
    int z=p?->x;
    printf("abc");
    y=z;
  }
  return y;
}
//без SNO
int baz_v0(foo*p){
  int y=800;
  if(p)
  {
    int z=p->x;
    printf("abc");
    y=z;
  }
  return y;
}

#18
13:18, 19 дек. 2013

Adler
> // основная проблемма: и что тут возвращать из функции?
Очевидно же - нет return, будет UB.
Правда я не ожидал что оператор должен "убивать" все действия после этого оператора. Я думал будет

  if(p)
      int z=p->x;
  printf("abc");
  y=10;
  return y;
}
#19
13:23, 19 дек. 2013

http://www.gamedev.ru/flame/forum/?id=167142

null-coalescing call
Object o = new Object();
o.?f(); // Вызывается метод f()
o = null;
o.?f(); // Ничего не просиходит:3

#20
13:58, 19 дек. 2013

Adler
он давно есть
if(p && bar(p->x==10))printf("x==10\n"); //функция bar - не вызовется. printf - тоже.

#21
13:59, 19 дек. 2013

TarasB
>Спрошу более конкретно, как выполнится это?
Никак, компилятор проигнорирует присваивание.

#22
14:01, 19 дек. 2013

kipar
>bar(void) и if(void) будут ошибкой компиляции.
why so?
В обоих случаях должно быть предупреждение.

#23
14:06, 19 дек. 2013

nes
Ты про С++? Ну ок, счас проверю в нем.
http://ideone.com/FupMwQ
Все в порядке, какие могут быть предупреждения. void же не приводится к bool.

#24
14:08, 19 дек. 2013

kipar
В с++ и ? оператора нету, я думал что мы про какой-то (С++)++ говорим.
А так да, в монструозном и батхертном С++ такого нет.

#25
14:12, 19 дек. 2013

nes
Но тогда зачем называть это void? Скорее это __abort_execution.

#26
14:18, 19 дек. 2013

kipar
Ну или так, да.

#27
14:53, 19 дек. 2013

kipar
>Очевидно же - нет return, будет UB.
да плохо получилось. надо передалать.

я тут подумал, можно запретить использовать SNO оператор для вывода типа значения возвращаемого из функции.
тоесть вот такой код будет компилироваться с ошибкой:

int get_x(foo*p){
  return p?->x; // ошибка: тип значения возвращаемого из функции не должен зависить от выражений использующих SNO.
}
но можно разрешить использовать для constexpr функций. дело в том, что они выполняються на этапе компиляции - значит получим ошибки на этапе компиляции
и это хорошо :)
+ внезапно, зачем я написал этот кусок кода здесь?

kipar
> Правда я не ожидал что оператор должен "убирать" все действия после этого
> оператора. Я думал будет
в примере выше всё равно придёться "убирать" какие-то действия, т.к они зависят от типа выражения возвращаемого SNO.
тут как минимум два варианта кого "убирать":
1)все statament`ы до самого конца блока с кодом. //дёшево и сердито.
2)только те statament`ы которые "сильно" зависят от типа значения возвращаемого выражением с SNO. //неявно и опасно, но всё же лучше чем AV, или нет?

надо ещё подумать над вторым вариантом, вдруг его можно доваести до ума.
а то наверно будет не очень хорошо, если он не выкинет "printf" вот тут:

int baz_v2(foo*p){
  int z=p?->x;
  printf("всё хорошо 'z = p->x'"); // надо выкидыват эту строку или нет?
  int y=z;
  return 0;
}


добавил чуть позже:

Pushkoff
> он давно есть
> if(p && bar(p->x==10))printf("x==10\n"); //функция bar - не вызовется. printf -
> тоже.
я считаю что:

if(p&&bar(p->x==10))printf("x==10\n");
хуже и длиннее чем:
if(p)if(bar(p->x==10))printf("x==10\n");

ещё я считаю, что:

if(bar(p?->x==10)printf("x==10\n");
хуже чем оба варианта выше, но иногда охота писать именно так, ибо короче :)

я считаю, что выйгрышь от использования SNO хорошо заметен вот на таком говнокоде:

struct t_link;struct t_link{int id;t_link*next;};
int get_next_next_next_id(t_link*p){
  int id=0;
  {id=p?->next?->next?->next?->id;}
  return id;
}
*тут можно вставить код аналогичный тому что выше, только без SNO, но мне пока лень его писать*

#28
15:08, 19 дек. 2013

Adler
твой вариант в таком виде
if(p?->x==10)printf("x==10\n");
в принципе еще реализуем и понятен
разворачивается в это
if(p&&p->x==10)printf("x==10\n");

но как компилятор должен узнать что bar не должен вызываться? может он должен вызваться с false и соответственно вызов printf должен зависеть от того что вернет bar

#29
15:09, 19 дек. 2013

Adler

//короткая запись c SNO
int baz_v1(foo*p){
  int y=5;
  int z=p?->x;
  printf("abc");
  y=z;  <<<------- хорошо подумай над этой строчкой
  return y;
}
//длинная запись без SNO
int baz_v1(foo*p){
  int y=5;
  if(p){
    int z=p->x;
    printf("abc");
    y=z;
  }
  return y;
}
Страницы: 1 2 3 4 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.