Re[5]: Использование !!, &* и подобного
От: andrey.desman  
Дата: 02.07.18 17:51
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>>>!! — это, в некотором смысле, идеоматическое выражение, и компилятор его, скорее всего, знает, и соптимизирует. Я вот !~ — это экзотика, и компилятор вряд ли будет его оптимизировать.

AD>>Ой, да что тут оптимизировать? not, jz. Это "!= -1" как раз должен оптимизироваться в !~.
Pzz>Ну, например, если оно в if'е стоит, то очень вероятно, что можно обойтись без nоt'a.

Можно загрузить 0xffffffff и проверить and или cmp, но меньше, чем через not, не нагенеришь кода.
Re: Использование !!, &* и подобного
От: rm822 Россия  
Дата: 02.07.18 19:11
Оценка: 1 (1)
Здравствуйте, _pk_sly, Вы писали:

__>Всем привет!


__>Кто как относится к использованию таких, как бы, операторов в C++ как "!!", "&*" и подобных? (а кстати, каких?)

нормально, они привычные, хотя и постепенно уходят из употребления
~0, ^ — тоже ничего так, полезненько
скоро будет еще и <=>
Re[3]: Использование !!, &* и подобного
От: andyp  
Дата: 02.07.18 21:58
Оценка:
Здравствуйте, _pk_sly, Вы писали:

__>Совершенно другой набор знаков, не так ли?


Ну делай так тогда: bool(val)
Re[2]: Использование !!, &* и подобного
От: _NN_ www.nemerleweb.com
Дата: 04.07.18 10:27
Оценка:
Здравствуйте, Nikе, Вы писали:

__>>Ну или вот &*. Есть у нас любого вида smart pointer. Для примера возьмём unique_ptr. Для того, чтобы программист не запутался, неявная конверсия — запрещена. Зато, есть оператор *.

N>get лучше, так как разыменование нулевого указателя — это UB. На практике конечно работало.
Чем get будет лучше ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Использование !!, &* и подобного
От: Nikе Россия  
Дата: 04.07.18 12:04
Оценка:
Здравствуйте, _NN_, Вы писали:

N>>get лучше, так как разыменование нулевого указателя — это UB. На практике конечно работало.

_NN>Чем get будет лучше ?

Это официальный способ и без уб.
Нужно разобрать угил.
Re[4]: Использование !!, &* и подобного
От: _NN_ www.nemerleweb.com
Дата: 04.07.18 13:14
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, _NN_, Вы писали:


N>>>get лучше, так как разыменование нулевого указателя — это UB. На практике конечно работало.

_NN>>Чем get будет лучше ?

N>Это официальный способ и без уб.

&* такой же официальный способ.
А каким образом нет неопределенного поведения ?

unique_ptr<int> a;
int i = *a.get();
int j = *a;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Использование !!, &* и подобного
От: Nikе Россия  
Дата: 04.07.18 13:22
Оценка:
Здравствуйте, _NN_, Вы писали:

N>>Это официальный способ и без уб.

_NN>&* такой же официальный способ.
Нет.

_NN>А каким образом нет неопределенного поведения ?

Не распарсил.

_NN>
_NN>unique_ptr<int> a;
_NN>int i = *a.get();
_NN>int j = *a;
_NN>

Не в тему, где тут аналог &*?

UB возникает из-за возможного разыменования nullptr;
Нужно разобрать угил.
Re[6]: Использование !!, &* и подобного
От: _NN_ www.nemerleweb.com
Дата: 04.07.18 13:24
Оценка: -1
Здравствуйте, Nikе, Вы писали:

_NN>>А каким образом нет неопределенного поведения ?

N>Не распарсил.

_NN>>
_NN>>unique_ptr<int> a;
_NN>>int i = *a.get();
_NN>>int j = *a;
_NN>>

N>Не в тему, где тут аналог &*?

Так вот же разыменовывание нулевого указателя перед глазами: *a.get()
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: Использование !!, &* и подобного
От: _NN_ www.nemerleweb.com
Дата: 05.07.18 07:09
Оценка:
Здравствуйте, _NN_, Вы писали:

Попробую разжевать.
Итак внимательно следим

template <class T, class D>
class unique_ptr
{
T* p;

public:
T* get() const
{
  return p;
}

T& operator*() const
{
  return *p;
}
}


*a == a.operator*() == *(a.p)
*a.get()== *(a.get()) == *(a.p)

Разницы нет, что и требовалось доказать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Использование !!, &* и подобного
От: Nikе Россия  
Дата: 05.07.18 07:25
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Разницы нет, что и требовалось доказать.


Разыменование невалидного указателя это UB. В операторе * ты делаешь это. UB означает, что ситуация может быть развиваться так как ты ожидаешь, но может и диск отформатировать.
Нашёл такой пример:
struct S { int some_field; };

void do_something(S* p)
{
  // Несмотря на то, что мы всего лишь берём адрес поля,
  // а не обращаемся к его значению -- формально мы выполняем разыменование,
  // т.е. в случае p == nullptr имеем UB.
  int *field_ptr = &p->some_field;
  // ...
  // Т.к. выше в случае p == nullptr имеем UB, компилятор может
  // оптимизировать код с предположением, что p != nullptr (для случая без UB!)
  // и убрать эту проверку как лишнюю.
  if (p != nullptr)
  {
     // Код в этом блоке может быть выполнен даже если p == nullptr.
     // ...
  }
}
Нужно разобрать угил.
Re[9]: Использование !!, &* и подобного
От: _NN_ www.nemerleweb.com
Дата: 05.07.18 07:27
Оценка:
Здравствуйте, Nikе, Вы писали:

N>Здравствуйте, _NN_, Вы писали:


_NN>>Разницы нет, что и требовалось доказать.


N>Разыменование невалидного указателя это UB. В операторе * ты делаешь это. UB означает, что ситуация может быть развиваться так как ты ожидаешь, но может и диск отформатировать.

Хорошо, а чем в этом плане отличается функция 'get' ?
*a.get() также может разыменовывать невалидный указатель.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: Использование !!, &* и подобного
От: Nikе Россия  
Дата: 05.07.18 07:29
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Хорошо, а чем в этом плане отличается функция 'get' ?

Тем что она не содержит UB преобразуя умный указатель в обычный.

_NN>*a.get() также может разыменовывать невалидный указатель.

Это уже будет UB, но оно будет на совести пользователя.
Нужно разобрать угил.
Re[11]: Использование !!, &* и подобного
От: _NN_ www.nemerleweb.com
Дата: 05.07.18 07:37
Оценка: +1 :)
Здравствуйте, Nikе, Вы писали:

Перечитал снова и наконец понял что с чем сравнивается.
&* vs. get

Если так сравнивать, то конечно get более верный способ.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Использование !!, &* и подобного
От: fk0 Россия https://fk0.name
Дата: 19.07.18 07:43
Оценка:
Здравствуйте, _pk_sly, Вы писали:


__>Кто как относится к использованию таких, как бы, операторов в C++ как "!!", "&*" и подобных? (а кстати, каких?)


__>У меня на работе возник спор. Мои коллеги, опытные С++ программисты, сказали мне, что они смотрят на эти знаки в упор и вообще не понимают, что это такое.


опытные программисты насиженное место, job security...

__>Наверняка есть и другие удобные штуки, но этими я пользуюсь постоянно.


__>Как думает сообщество, действительно ли это — какая-то нечитаемая непонятная хрень, которой не стоит пугать людей или же нормальная техника C++?


Код валидный и понятный. Спорить не о чём.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.