Я только что узнал этот отличный шаблон (из javascript на самом деле), и я хотел бы применить его к моему коду С++.
Чтобы объяснить шаблон, скажем, я представляю строку как связанный список из них:
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);
Будут ли подобные операции работать как предполагаемые кросс-платформенные? Я читал, что "если вы дважды читаете переменную в выражении, где вы также пишете ее, результат будет undefined". Но интуитивно я чувствую, что короткое замыкание гарантирует порядок, не так ли?