= 0;
size_t size_ = ((tmp_size_ = size(get_name(args)), tmp_size_ + !!tmp_size_) + ...);
...
}Здесь ведь нет UB?
С учетом наличия запятой в подвыражении fold'а - не должно быть, да. Edit: Совет неверный, см. следующее сообщение.
Или обманываю: запятая не должна роли играть =) + unsequenced, модификация значения объекта через = - side-effect. Несмотря на то, что подвыражения fold'а sequenced, само выражение - unsequenced. Edit: Предыдущему сообщению не верить.
не перегруженная запятая же гарантирует последовательное выполнение с последовательными сайд эффектами.
В пределах подвыражения. Но сами подвыражения друг для друга оказываются unsequenced, поскольку через +, относительно которого гарантий нет.
но и значение временной переменной каждый раз задается при входе в подвыражение плюса.
порядок вычисления в + не важен
Это и есть side-effect, который оказывается unsequenced.
Порядок важен.
Может, лучше просто предложить обернуть всё в IILE?
по сути я же не полагаюсь на значение tmp_size, которое вычислено на другом подвыражении.
Да, вероятно, поскольку для вычисления в функциях строгие гарантии.
Для стандарта нет разницы: If a side effect on a memory location ... is unsequenced relative to ... another side effect on the same memory location ... the behavior is undefined. Edit: Это аккурат Ваш случай.
Ладно, спасибо, опять эти лямбды придется использовать(
Обсуждают сегодня