正在初始化类型为“的引用”;国际及&引用;(非常量限定)具有类型为“的值”;“bool”;一些黑客? 我来到C++这个C++代码:
更新 g++似乎也不接受它(在Ben Voight的回答之后更新以澄清:g++可以编译普通文件(icc不能),但如果您尝试在没有第二个参数的情况下调用,则会失败) 也报告了叮当声的问题 相关性:我试图用英特尔编译器编译,但失败了,因为这段代码就在那里 我不知道以前袖扣怎么会有这个 更新2:正在初始化类型为“的引用”;国际及&引用;(非常量限定)具有类型为“的值”;“bool”;一些黑客? 我来到C++这个C++代码:,c++,gcc,reference,C++,Gcc,Reference,更新 g++似乎也不接受它(在Ben Voight的回答之后更新以澄清:g++可以编译普通文件(icc不能),但如果您尝试在没有第二个参数的情况下调用,则会失败) 也报告了叮当声的问题 相关性:我试图用英特尔编译器编译,但失败了,因为这段代码就在那里 我不知道以前袖扣怎么会有这个 更新2: 袖扣用g++编译得很好,不是用icc,我已经联系了维护人员,他们在新版本中删除了有问题的代码。这段代码显然有问题int&无法绑定到类型为bool的左值,也无法绑定到转换产生的右值。但是,它也可以编译而不出错
袖扣用g++编译得很好,不是用icc,我已经联系了维护人员,他们在新版本中删除了有问题的代码。这段代码显然有问题
int&
无法绑定到类型为bool
的左值,也无法绑定到转换产生的右值。但是,它也可以编译而不出错
这是因为,与普通函数不同,模板函数中默认参数的语义分析仅在“在需要默认参数值的上下文中调用函数时”才会发生,如标准8.3.6p5、14.7.1p3和14.7.1p13所述
这意味着编译错误只会在其他代码调用此函数时发生,而没有为第二个参数提供实际参数。
如果((is\u up!=is\u up))
看起来可疑--这是源于原始代码,还是其中一个参数应该是\u is\u up
?确定吗?我得到了这个错误:错误:无法将“\u is\u up”从“bool”转换为“int&”
@larsmans:同意这是可疑的。考虑到is\u up
应该是触发器(这是舍入替代),我认为应该读if((is\u up=!is\u up))
@H2CO3:类型需要匹配。无论是bool
,还是int
,都可以工作。@H2CO3:另外,static
变量对于每个不同的FloatType
都是独立的。在这里,所有默认调用都共享相同的状态变量。它不是用英特尔编译器编译的,我想它比需要的更严格?我可能需要一个标志来告诉它不要这样做。@Jens:错误是发生在模板定义中还是在使用点上?破坏从未实例化的模板的编译是一个相当严重的编译器不一致性问题。在模板编译的第一阶段,应该只做一些检查,大多数检查只需要在实例化(第二阶段)时进行。在模板定义中,我认为没有任何用处(这不是我自己试图调试的代码,我将修补函数,然后再试一次)@JensTimmerman:,自C++03以来,标准措辞发生了一些变化。我认为编译器正在做的事情可以用旧的措辞来辩护,但不再是了。您可能应该向英特尔发送一份错误报告,因为这是一种不寻常的情况。@JensTimmerman:G++错误消息中的行,rounding::roundalternate(argv[0])
,看起来确实像是用法。并使用默认参数。这将使所有编译器都失败。
// 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 );
}
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 )
^
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])