正在初始化类型为“int&”的引用(不是const限定的)值类型为“bool”的一些黑客攻击?

时间:2013-11-20 15:53:52

标签: c++ gcc reference

我来了accros这个c ++代码here

  // 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 );
    }

这让我感到困惑,这应该如何运作?如何在每次调用此函数时进行备用调用?

这段代码是完全错误的,还是应该因某些编译器的怪异而起作用? 似乎用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 )
                                                                  ^

更新 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])

Other people报告了clang的问题

相关性:我正在尝试使用intel编译器编译cufflinks,但它失败了,因为此代码在那里。

我不知道袖扣之前是如何编译的。

UPDATE2: 袖扣使用g ++编译得很好,而不是icc,我已经联系了维护者,他们已经删除了新版本中有问题的代码。

1 个答案:

答案 0 :(得分:4)

这段代码显然很麻烦。 int&无法绑定到bool类型的左值,并且无法绑定到转换产生的右值。但是,它也可以毫无错误地编译。

这是因为,与普通函数不同,模板函数中默认参数的语义分析仅在“在需要默认参数值的上下文中调用函数时”发生,在8.3.6p5,14.7.1p3中进行了解释,和标准的14.7.1p13。

这意味着只有当其他代码调用此函数而不为第二个参数提供实际参数时,才会发生编译错误。