Составно, если проверка на нуль, а затем другие условия в C++ всегда безопасны?

(этот вопрос является точной копией Составного, если проверка на нулевое значение, а затем другие условия в C всегда безопасны? но о C++, а не C. Было отмечено, что вопрос должен быть более конкретным).

Я использовал следующий тип if состояние на много времени.

char* ptr = ...;
if (ptr != NULL && ptr[0] != '\0') // <=== is this always safe?
{ /* ... */ }

Опирается на ptr != NULL проверяться перед ptr[0] !='\0',

Это безопасно по всем стандартам, компиляторам, архитектурам? Или есть вероятность, что ptr[0] != '\0' будет проверено раньше ptr != NULL?

2 ответа

Это безопасно в этом случае. Оценка короткого замыкания означает, что RHS && Оператор будет оцениваться, только если первое верно.

C++ позволяет переопределить bool operator && для пользовательских типов. Использование переопределения && не следует оценке короткого замыкания, поэтому безопасность теряется. Редко хорошая идея перегружать этот оператор.

Вот пример, показывающий поведение перегруженного && оператор:

struct Foo {};

bool operator && (const Foo&, const Foo&) { return true; }

#include <iostream>

Foo make_foo()
{
  std::cout << "making foo\n";
  return Foo();
}

int main()
{
  make_foo() && make_foo(); // evaluates both expressions
}

Это безопасно, пока оператор && не перегружен

Черновик стандарта C++ (N3337 - 5.14 Логический оператор AND):

Операторы && группируются слева направо. Оба операнда контекстуально преобразуются в тип bool (пункт 4). Результат равен true, если оба операнда имеют значение true, в противном случае - false. В отличие от &, && гарантирует оценку слева направо: второй операнд не оценивается, если первый операнд является ложным.

Другие вопросы по тегам