情况如下:
void funct( unsigned u, double d, float f )
{
u = 12;
}
void funct( double u, int d, void* asd, float f )
{
u = 13;
}
int main()
{
const unsigned u = 123;
double d = 123.123;
float f = 123.123;
funct( u, d, f, 123 );
return 0;
}
给了我:
./src/test.cpp:19: error: no matching function for call to 'funct(const unsigned int&, double&, float&, int)'
./src/test.cpp:4: note: candidates are: void funct(unsigned int, double, float)
./src/test.cpp:8: note: void funct(double, int, void*, float)
这是绝对预期的错误,因为没有合适的函数可以调用,好的,没问题。但是看看编译器错误:
V V V
no matching function for call to 'funct(const unsigned int&, double&, float&, int)
为什么这些&
在那里?当我拨打正确的电话时 - 一切都很好,所有参数,如预期的那样,不作为参考传递。
使用Ubuntu 10.04
,64位和g++ version 4.4.3
答案 0 :(得分:4)
您正在向该函数传递一个实数变量,该变量可以分配给(“lvalue
”)。当然你按值而不是通过引用传递它 - 但重点是,在你的函数调用中你能够通过引用传递它,因为它是lvalue
。
然后:如果您的值为int&
(lvalue
),则可以将其发送给接受int
的函数(rvalue
或{ {1}}) - 不是相反。
答案 1 :(得分:4)
编译器不知道您是打算按值还是通过引用传递变量。它不能排除正确的函数(你未声明的函数)期望引用的可能性。
答案 2 :(得分:0)
它尝试映射参数表达式,仅根据类型表达它们。因此,对于T
类型的左值,它使用T&
,对于T
类型的左值,它使用T
(未修改)。
当然,参数表达式从不具有引用类型(没有表达式可以具有引用类型),但这是GCC表达它的方式。对于C ++ 0x,将有lvalues,xvalues和prvalues。 GCC可能会使用T&
作为第一个,T
作为后两个,或T&&
作为第二个,T
作为后者。
Clang在这里做得更好
main1.cpp:16:9: error: no matching function for call to 'funct'
funct( u, d, f, 123 );
^~~~~
main1.cpp:5:6: note: candidate function not viable: no known conversion from 'float' to
'void *' for 3rd argument
void funct( double u, int d, void* asd, float f )
^
main1.cpp:1:6: note: candidate function not viable: requires 3 arguments, but 4 were provided
void funct( unsigned u, double d, float f )
^
1 error generated.