【发布时间】:2020-01-24 15:17:19
【问题描述】:
我正在尝试构建一个派生自std::valarray<T> 的类,以便在其上使用我自己的方法。我遇到了一个关于使用operator[] 赋值的问题。经过一番努力,我想我终于发现了问题所在。虽然分配给std::slice_array<T> 不会构成问题,但分配给std::gslice_array<T> 会。
这是重现问题的代码:
#include <valarray>
#include <cassert>
#include <iostream>
int main() {
const size_t rows = 16;
const size_t cols = 24;
assert(rows%8 == 0);
assert(cols%8 == 0);
// return b_th 8x8 block
auto get_block = [&rows, &cols](size_t b) -> std::gslice {
return std::gslice((b / (cols/8))*8*cols + (b % (cols/8))*8, {8, 8}, {cols, 1});
};
// zeros(rows, cols) but 1D
std::valarray<int> v(0, rows*cols);
auto print = [&rows, &cols, &v]() -> void {
for (size_t i=0; i<rows; i++) {
for (size_t j=0; j<cols; j++)
std::cout << " " << v[i*cols + j];
std::cout << "\n";
}
std::cout << std::endl;
};
print();
// this is OK
v[get_block(1)] = 1;
print();
// this is also OK
std::slice_array<int> s = v[std::slice(2*cols, cols, 1)];
s = 2;
print();
// ???
std::gslice_array<int> g = v[get_block(3)];
// g = 3; // this line causes runtime error
print();
return 0;
}
知道如何解决这个问题吗?
【问题讨论】:
-
你用的是什么编译器?我的假设是
g使用对由get_block生成的临时gslice实例的元素的引用。我可以用G++重现同样的问题。但在 MSVC 上工作正常。对于 G++,当我们创建名为gslice的实例时问题消失了:auto b = get_block(3); std::gslice_array<int> g = v[b]; g = 3;,这工作正常。 -
@rafix07 是的,我正在使用 G++。按照您的建议创建新的
gslice实例时,问题已解决。谢谢!