Qwe*_*pal 3 c++ reference parameter-passing
我有一个有趣(或愚蠢)的面试问题.好吧,我知道下面的代码不会编译,但我无法回答如何修改类C以使代码编译.我被告知答案是喜欢Test(C(1));或void Test(C c)不可接受的.你能帮助我吗?
这是问题:
Q11.下面的代码会编译吗?如果没有,请进行任何您想要C类的更改,以便编译代码.
class C
{
public:
C(int i) {}
~C() {}
};
void Test(C &c)
{
}
int main(int, char*)
{
Test(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码不会编译.
没有办法让它编译C首先只更改类,因为签名main是错误的(char*永远不是第二个参数的类型).
但即使签名main是正确的,Test(1);也要隐含地创建一个临时对象C并将其传递给Test.但是,您无法将临时绑定到非const引用,并且我看不到任何方法只更改类C以创建可以绑定到参数的隐式临时Test.
编辑:我来最接近的是把friend void Test(int i) { }成C.这是使用Sun的CC编译器编译的,但无法使用ideone中的g ++ 4.4,4.5或4.8进行编译.EDIT2:从11.4/5开始,g ++在这里是正确的:函数被引入到类的范围内,而不是封闭的范围.
此任务无法回答,因为问题不在于类中C,而在于Test需要非const引用C.
在调用时Test(1),编译将查看签名Test,注意C可以隐式构造int(因为它不是explicit),但C(1)仍然是rvalue,并且Test需要左值.
可以通过更改签名来解决这个问题Test:
void Test(C const & c) {} // or
void Test(C c) {} // or, since C++11
void Test(C && c) {}
Run Code Online (Sandbox Code Playgroud)
或者用左值调用它main:
C c(1); // or C c = 1; if you desperately want to keep the implicit conversion
Test(c);
Run Code Online (Sandbox Code Playgroud)