Я только что изучил этот отличный шаблон (на самом деле из javascript) и хотел бы применить его к своему коду на C ++.
Чтобы объяснить шаблон, скажем, я представляю строку как связанный список из них:
struct link_char;
struct link_char
{
link_char * next;
char code;
};
Обратите внимание, что последний символ любой строки link_char всегда будет иметь код == 0. Это свойство означает, что я могу проверить значение в строке при использовании короткого замыкания &&, чтобы предотвратить доступ к NULL-указателям.
bool equals_hello( const link_char * first_char )
{
const link_char * c = first_char;
return c->code=='h'
&& (c=c->next)->code=='e'
&& (c=c->next)->code=='l'
&& (c=c->next)->code=='l' // if string == "hel", we short-circuit here
&& (c=c->next)->code=='o';
}
Мой вопрос касается безопасности, а не удобочитаемости. Я знаю, что короткое замыкание будет работать до тех пор, пока && не будет перегружен. Но будут ли операции присваивания происходить в правильном порядке, или это определяется реализацией?
Приведенный выше пример явно показывает, где могут происходить операции чтения / записи, но я также хотел бы использовать этот шаблон в ситуациях, когда могут быть побочные эффекты. Например:
// think of these as a bunch of HRESULT type functions
// a return value of 0 means SUCCESS
// a return value of non-zero yields an Error Message
int err;
( !(err=initialize()) && !(err=create_window()) && !(err=run_app() )
|| handle_error(err);
Будут ли операции такого типа работать как задумано на разных платформах? Я читал, что «если вы дважды прочитаете переменную в выражении, в которое вы также ее записываете, результат не определен». Но интуитивно я чувствую, что короткое замыкание гарантирует порядок, не так ли?