std::valarray 的加法具有不同的大小和不同的操作数顺序
Add of std::valarray got different sizes with different operand orders
std::valarray
的加法根据不同的操作数顺序得到不同的大小。
代码如下:
#include <iostream>
#include <valarray>
using namespace std;
int main() {
std::valarray<float> v0{3.f, 0.f};
std::valarray<float> v1{0.f};
std::valarray<float> v2 = v0 + v1;
std::valarray<float> v3 = v1 + v0;
cout << v2.size() << endl; // 2
cout << v3.size() << endl; // 1
}
编译器:
g++ (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
clang version 9.0.0-2~ubuntu18.04.2 (tags/RELEASE_900/final)
operator+()
不执行两个 std::valarray<float>
对象的连接,
std::valarray<float> v2 = v0 + v1;
此处,由于v1
的大小为1,它将v1
中的唯一值添加到v0
中的两个元素,因此大小保持为2。
std::valarray<float> v2 = v1 + v0;
但是这里,v1
的大小为 1,它会将第一个元素 3.f 添加到 v1
中的唯一元素,而 v0
的第二个值将被忽略.
这是通常发生的情况,但是两个 valarray
上的二元运算的行为是未定义的。
std::valarray
的加法根据不同的操作数顺序得到不同的大小。
代码如下:
#include <iostream>
#include <valarray>
using namespace std;
int main() {
std::valarray<float> v0{3.f, 0.f};
std::valarray<float> v1{0.f};
std::valarray<float> v2 = v0 + v1;
std::valarray<float> v3 = v1 + v0;
cout << v2.size() << endl; // 2
cout << v3.size() << endl; // 1
}
编译器:
g++ (Ubuntu 8.4.0-1ubuntu1~18.04) 8.4.0
clang version 9.0.0-2~ubuntu18.04.2 (tags/RELEASE_900/final)
operator+()
不执行两个 std::valarray<float>
对象的连接,
std::valarray<float> v2 = v0 + v1;
此处,由于v1
的大小为1,它将v1
中的唯一值添加到v0
中的两个元素,因此大小保持为2。
std::valarray<float> v2 = v1 + v0;
但是这里,v1
的大小为 1,它会将第一个元素 3.f 添加到 v1
中的唯一元素,而 v0
的第二个值将被忽略.
这是通常发生的情况,但是两个 valarray
上的二元运算的行为是未定义的。