Я столкнулся с довольно тонкой ошибкой при использовании std::minmax
со структурированными привязками. Похоже, что переданные rvalue не всегда будут копироваться, как можно было бы ожидать. Первоначально я использовал T operator[]() const
в пользовательском контейнере, но, похоже, то же самое и с литеральным целым числом.
#include <algorithm>
#include <cstdio>
#include <tuple>
int main()
{
auto [amin, amax] = std::minmax(3, 6);
printf("%d,%d\n", amin, amax); // undefined,undefined
int bmin, bmax;
std::tie(bmin, bmax) = std::minmax(3, 6);
printf("%d,%d\n", bmin, bmax); // 3,6
}
Использование GCC 8.1.1 с -O1 -Wuninitialized
приведет к тому, что 0,0
будет напечатано в качестве первой строки и:
warning: ‘<anonymous>’ is used uninitialized in this function [-Wuninitialized]
Clang 6.0.1 в -O2
также выдаст неверный первый результат без предупреждения.
На -O0
GCC выдает правильный результат и без предупреждений. Для clang результат кажется правильным в -O1
или -O0
.
Разве первая и вторая строки не должны быть эквивалентны в том смысле, что rvalue по-прежнему допустимо для копирования?
Кроме того, почему это зависит от уровня оптимизации? Особенно меня удивило, что GCC не выдает никаких предупреждений.
auto [amin, amax]
? Это новый синтаксис в С++ 17? - person R Sahu   schedule 24.07.2018