我有一个有趣(或愚蠢)的面试问题。好吧,我知道下面的代码不会编译,但我无法回答如何修改类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;
}
答案 0 :(得分:7)
代码无法编译。
由于C
的签名错误(char *是从不第二个参数的类型),因此无法使其编译仅更改类main
但即使main
的签名正确Test(1);
,也希望隐式创建C
的临时对象并将其传递给Test
。但是,您无法将临时绑定到非const引用,并且我看不到任何方法只更改类C
以创建可以绑定到Test
的参数的隐式临时。 / p>
编辑:我最接近的是将friend void Test(int i) { }
放入C
。这是使用Sun的CC编译器编译的,但无法使用ideone中的g ++ 4.4,4.5或4.8进行编译。 EDIT2:从11.4 / 5开始,g ++在这里是正确的:函数被引入到类的范围内,而不是封闭的范围。
答案 1 :(得分:6)
此任务无法回答,因为问题不属于班级C
,而是Test
想要对C
进行非const引用。
调用Test(1)
时,编译将查看Test
的签名,请注意C
可以隐式构造int
(因为它不是explicit
}}),但C(1)
仍然是右值,Test
需要左值。
可以通过更改Test
:
void Test(C const & c) {} // or
void Test(C c) {} // or, since C++11
void Test(C && c) {}
或者使用main
中的左值来调用它:
C c(1); // or C c = 1; if you desperately want to keep the implicit conversion
Test(c);
答案 2 :(得分:1)
http://ideone.com/pnZwh6怎么样 这是一个黑客,但它让代码编译。
class C
{
public:
C(int i) {}
~C() {}
#define C const C
};
void Test(C &c)
{
}
int main(int, char**)
{
Test(1);
return 0;
}