void print( int & a ){ cout << a << endl; }
void print( const int & a ){ cout << 2*a << endl; }
void print( float a ){ cout << 3*a << endl; }
为什么2
是print(1)
的输出?
答案 0 :(得分:7)
这个问题的原则是,您需要知道匿名临时工具不能绑定到非const
引用,并且可以绑定到const
引用。
1是int
类型的匿名临时用户。
因此,重载解析会优先考虑const int&
绑定。
某些编译器(较旧的MSVC)会错误地允许绑定到int&
。在标准C ++中,如果缺少const int&
重载,则会调用float
重载。
答案 1 :(得分:1)
对于所有三个重载:
void print( int & a ){ cout << a << endl; }
)未调用第一个重载,因为它只接受变量。 (除非你有一个旧的MSVC编译器)。void print( const int & a )
)第二个重载类型为const int&
,它可以接受int类型的临时类型或int类型的变量。void print( float a )
)第三个重载有一个float类型的参数,如果没有int类型的重载,它将被调用。因此,由于存在接受int类型的临时变量的重载,因此选择第二个重载超过第三个。