当我编写一个简单的算术表达式valarray
并将结果分配给auto
我尝试访问 gcc 上的结果时出现段错误。
#include <iostream>
#include <valarray>
using std::ostream; using std::valarray;
ostream& operator<<(ostream&os, const valarray<double>&vs) {
os << "[";
for(auto&v : vs) os << v << " ";
return os << "]";
}
int main() {
valarray<double> a{ 1.0, 2.0, 3.0, 4.0 };
std::cout << "a: " << a << "\n";
valarray<double> b{ 2.0, 4.0, 6.0, 8.0 };
std::cout << "b: " << b << "\n";
valarray<double> c{ 2.0, 1.5, 0.5, 0.25 };
std::cout << "c: " << c << "\n";
valarray<double> x = ( a + b ) / 2;
std::cout << "x: " << x << "\n";
// this still works:
auto y = ( a + b ) / 2;
// The following will result in a segfault:
std::cout << "y:" << y << "\n";
}
参考资料说,实现可以选择算术运算重载的返回类型可能不是valarray
-value 而是“表现得像它”的东西:
允许按值返回 valarray 的运算符返回不同类型的对象。这种类型需要隐式转换为 valarray 并支持作为所有采用 valarray& 参数的函数的参数。这允许写时复制实现。
好吧,我operator<<
应该呼吁“隐式转换”,不是吗?
那么为什么会出现段错误?
$ ./valarray01.cpp.x
a: [1 2 3 4 ]
b: [2 4 6 8 ]
c: [2 1.5 0.5 0.25 ]
x: [1.5 3 4.5 6 ]
Segmentation fault (core dumped)
gcc 版本 6.2.0 20160901 (Ubuntu 6.2.0-3ubuntu11~14.04)
当我尝试clang(在 linux 上,所以可能是 gcc 的 stdlib)时,我持怀疑态度,并且......它有效:
clang 版本 3.9.1-svn288847-1~exp1 (branches/release_39)
$ ./valarray01.cpp.x
a: [1 2 3 4 ]
b: [2 4 6 8 ]
c: [2 1.5 0.5 0.25 ]
x: [1.5 3 4.5 6 ]
y:[1.5 3 4.5 6 ]
好吧,在我提交 gcc-bug 之前......我做错了吗?是我的auto
恶吗?还是真的是gcc?