Ошибки, баги, вопросы - страница 2324

 
fxsaber:
Баг с указателем

А какая с этим разница?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2018.09.17 14:17

Это баг?
class A {};

A* a = NULL;

bool b1 = a && true; // OK
bool b2 = true && a; // '&&' - illegal operation use

 
A100:

А какая с этим разница?

У меня очень плохая память. Некоторые "велосипеды" изобретаю по несколько раз.

 
Думаю что такая ошибка неспроста, потому что (если было бы свободное неявное приведение указателя к bool) не ясно как интерпретировать
class A {
public:
        bool operator&&( bool a ) { return a; }
};
void OnStart()
{
        A *a, *b;
        if (a && b);
}

то ли как

        if ((bool)a &&(bool)b);       //(1)

то ли как

        if ((*a).operator&&((bool)b));//(2)
 
A100:
Думаю что такая ошибка неспроста, потому что (если было бы свободное неявное приведение указателя к bool) не ясно как интерпретировать

Да, в Вашем случае неоднозначность. По-хорошему, на такое должно быть, как минимум, предупреждение компилятора.

В моем же гораздо более простом случае все четко. Думаю, и C++ с этим согласен.

 

fxsaber:
Это баг?

class A {};

A* a = NULL;

bool b1 = a && true; // OK
bool b2 = true && a; // '&&' - illegal operation use

Как временное решение, используйте оператор '!' (logical not)

class A {};

A* a = NULL;

bool b1 = !!a && true;
bool b2 = true && !!a;


Мы подумаем на решением (можно ли менять поведение сейчас, когда существует большое количество кодов ?)
Возможно, что для указателя, операция приведения к bool, будет операцией над указателем, а не объектом на который он указывает.

В этом случае, для выполнения операции над объектом необходимо будет записать код так

class A {};

A* a = NULL;

bool b1 = *a && true;
bool b2 = true && *a;

Операторы приведения, тоже хотим добавить, но эта задача (очень) неприоритетная
 
Ilyas:

Как временное решение, используйте оператор '!' (logical not)

Двойное отрицание компилятор оптимизирует?

 
Ilyas:
А были серьезные причины отказаться от оператора ->?
 
TheXpert:
А были серьезные причины отказаться от оператора ->?

Нет, серьёзных причин не было.

Единственное оправдание его отсутствия - это забота о неокрепших умах пользователей, не знакомых с C++.

 
fxsaber:

Двойное отрицание компилятор оптимизирует?

Да, оптимизирует

[Удален]  
Ilyas:

Нет, серьёзных причин не было.

Единственное оправдание его отсутствия - это забота о неокрепших умах пользователей, не знакомых с C++.

Думаю, что ничего страшного не случится, если вы его добавите.

На какое-то время можно будет разрешить использовать точку с указателями, там где нет неоднозначности.

И конечно выдавать предупреждение.