std::minmax
在使用结构化绑定时,我遇到了一个相当微妙的错误。似乎传递的右值并不总是像预期的那样被复制。最初我T operator[]() const
在自定义容器上使用 a ,但它似乎与文字整数相同。
#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 at-O2
也会给出错误的第一个结果而没有警告。
在-O0
GCC 给出了正确的结果并且没有警告。-O1
对于 clang,结果在或处似乎是正确的-O0
。
在右值仍然可以被复制的意义上,第一行和第二行不应该是等价的吗?
另外,为什么这取决于优化级别?特别令我惊讶的是 GCC 没有发出警告。