情况1:
std::valarray<int> data = {1,4,0,2,5};
std::valarray<bool> exp_mask = data <= 2;
std::mask_array<int> marr1 = data[mask];
marr1 = 10;
案例2:
std::valarray<int> data = {1,4,0,2,5};
data[data <= 2] = 11; // 7
案例3:
std::valarray<int> data = {1,4,0,2,5};
std::mask_array<int> marr2 = data[data <= 2];
marr2 = 12;
案例 1 和案例 2 都按预期工作(数据经过适当修改)。但是,案例 3 失败得可怕且不可靠(对我来说它是分段错误的)。在使用 gdb 进一步检查后,看起来内部存储的掩码指向临时data <= 2
valarray 的缓冲区,该缓冲区在第 2 行之后被销毁。然后当第 3 行进行写入时,掩码完全是垃圾,并试图对其进行索引设置数据的掩码值是未定义的行为。
我在标准中的任何地方都找不到为什么允许这种行为(标准对 valarray 非常模糊)。这是 libstdc++ 的失礼,还是我应该期待这个结果,为什么?
编译器设置测试:
- g++4.8.2 -O0 -g -std=c++0x
- clang++ -O0 -g -std=c++11
我相信我的 libstdc++ 版本是 3.4.19(只是按照这个找到它)