【发布时间】:2016-07-17 00:38:47
【问题描述】:
我正在尝试制作一个模板运算符函数,用于从向量中减去标量并将结果返回到向量中。下面的功能是我能够想出的:
// vector - scalar
template<typename T1, typename T2>
auto operator - ( const Vector<T1> & lhs, const T2 & scalar )-> Vector<std::common_type_t<T1,T2>>
{
using T3 = std::common_type_t<T1, T2>;
Vector<T3> result;
result.base.reserve( lhs.base.size() );
std::transform( lhs.base.begin(), lhs.base.end(), std::back_inserter( result.base ),
[&scalar]( const T3 & element ) { return element - scalar; } );
return result;
}
但是,当尝试从向量 (int) 中减去标量 (float) 时,结果不正确。我怀疑问题是因为操作数经历了通常的算术转换,其中包括积分提升。
【问题讨论】:
-
“不正确”和“错误结果”不是有用的问题描述。一个简单的测试会产生预期的结果,使用
std::vector<int>和float标量会产生具有正确值的std::vector<float>结果。无法重现。定义“错误的结果”。 -
@Sam Varshavchik,不确定您所说的“无法重现”是什么意思——演示的目的是重现问题。无论如何,示例显示:v - s = (1, 2, 3) - 2.1 = (-1.1, -0.0999999, 0.9),这是错误的。正确的结果是向量:[-1.1f, -0.1f, 0.9f]。令我困惑的是,第二个元素产生 -0.0999999 而其他元素是正确的。
标签: c++ templates lambda integer-promotion