ошибка с ++;как я должен интерпретировать его значение? - PullRequest
1 голос
/ 01 ноября 2011

Это может быть глупо спрашивать, но я путаюсь с ошибкой компиляции, когда пытаюсь использовать идиому безопасного bool при чтении этой статьи.Ниже приведен мой код, и я указал строки, в которых я получаю ошибки в функции main ().

// is OK case
class BoolVer_OK {
    bool m_OK;

public:
    BoolVer_OK(bool ok) : m_OK(ok){}
    operator bool() {  return m_OK; }
};

//  Not OK Case
class BoolVer_NotOK {
    bool m_notOK;

public:
    BoolVer_NotOK(bool ok) : m_notOK(!ok){}
    bool operator !() const{ reportexecution;  return !m_notOK; }
};

main()
{
    BoolVer_OK ok(true);
    BoolVer_NotOK notOK(true);
    ok<<1;  // Line#1     is valid
    notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
return 0;
}

Почему мы не получили ошибку в # Line1, а в # Line2.Оба результата приводят к логическому значению перед оператором <<.

Ответы [ 3 ]

7 голосов
/ 01 ноября 2011

ok поддерживает operator bool, и C ++ имеет эту замечательную функциональность, называемую неявное приведение и продвижение, и в этом случае для оператора двоичного сдвига <<, bool повышается до int, и затем это смещается на 1.

Во втором случае вы не указали этот оператор, и, следовательно, нечего неявно преобразовать (и продвинуть) в int, и вы получите ошибку. Попробуйте позвонить !notOk до смены, теперь есть bool, который будет повышен.

1 голос
/ 01 ноября 2011
ok<<1;  // Line#1     is valid
notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')

Это происходит потому, что ok преобразуется в bool неявно (перегруженный оператор), тогда как notOK не имеет этого оператора.

Проверьте следующий код:

  BoolVer_OK ok(true);
  BoolVer_NotOK notOK(true);
  int z = ok<<1;  // is valid
  //notOK << 1; // error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
  int x = false << 1;
  return 0;

Логические значения в левой части оператора сдвига преобразуются в целые, а затем сдвигаются.

1 голос
/ 01 ноября 2011

Не думаю, что компилятор автоматически вставит вызов operator!, а затем отменит его, чтобы получить bool, который вы хотите. Из того, что я вижу в приведенной вами ссылке, они проводят свои тесты с двойным отрицанием, !!.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...