Я столкнулся с довольно тонкой ошибкой при использовании std::minmax со структурированными привязками. Похоже, что переданные rvalues не всегда будут скопированы, как можно было бы ожидать. Первоначально я использовал 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.
Должна ли первая и вторая строка быть эквивалентной в том смысле, что значение r остается действительным для копирования?
Кроме того, почему это зависит от уровня оптимизации? В частности, я был удивлен, что GCC не предупреждает.