我在这里来了accros这个c ++代码:
// round alternate
// Bias: none for sequential calls
bool _is_up = false;
template <typename FloatType>
FloatType roundalternate( const FloatType& value, int& is_up = _is_up )
{
if ((is_up != is_up))
return roundhalfup( value );
return roundhalfdown( value );
}
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,这应该如何运作?这应该如何在每次调用此函数时进行备用调用?
这个代码是完全错误的,还是应该由于某些编译器的怪异而起作用?似乎用g ++编译好了,但我现在无法重现这一点.icc不接受它:
rounding.h(183): error: a reference of type "int &" (not const-qualified) cannot be initialized with a value of type "bool"
FloatType roundalternate0( const FloatType& value, int& is_up = _is_up )
^
Run Code Online (Sandbox Code Playgroud)
更新 g ++似乎也不接受它(在Ben Voight的回答之后更新澄清:g ++可以编译普通文件(icc不能),但是如果你尝试在没有第二个参数的情况下调用则会失败)
bla.h: In function ‘FloatType rounding::roundalternate(const FloatType&, int&) [with FloatType = char*]’:
bla.h:220:35: error: could not convert ‘rounding::_is_up’ from ‘bool’ to ‘int&’
rounding::roundalternate(argv[0])
Run Code Online (Sandbox Code Playgroud)
其他人也在报告clang的问题
相关性:我正在尝试使用intel编译器编译袖扣,但它失败了,因为这段代码就在那里.
我不知道袖扣之前是如何编译的.
update2:使用g ++编译的袖扣很好,而不是icc,我已经联系了维护者,他们已经删除了新版本中有问题的代码.
这段代码显然很麻烦。 int&无法绑定到 类型的左值bool,也无法绑定到转换产生的右值。但是,它也可以编译而没有错误。
这是因为,与普通函数不同,模板函数中默认参数的语义分析仅发生在“当在需要默认参数值的上下文中调用该函数时”,如 8.3.6p5、14.7.1p3 和 14.7 中所述。标准的 1p13。
这意味着仅当其他代码调用此函数而不为第二个参数提供实际参数时,才会发生编译错误。