Я столкнулся с довольно тонкой ошибкой при использовании 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 не предупреждает.