3

我有一个有趣(或愚蠢)的面试问题。好吧,我知道下面的代码不会编译,但是我无法给出关于如何修改 C 类以使代码编译的任何答案。有人告诉我,答案喜欢Test(C(1));void Test(C c)不可接受。你能帮助我吗?

这是问题:

问题 11。下面的代码会编译吗?如果没有,请进行任何您想要分类 C 的更改,以便编译代码。

class C
{
public:
    C(int i) {}
    ~C() {}
};

void Test(C &c)
{
}

int main(int, char*)
{
    Test(1);
    return 0;
}
4

3 回答 3

7

代码不会编译。

没有办法让它编译只改变类C,因为签名main是错误的(char*永远不是第二个参数的类型)。

但即使 的签名main是正确的,也Test(1);希望隐式创建一个临时对象C并将其传递给Test. 但是,您不能将临时对象绑定到非常量引用,而且我看不到任何方法可以仅更改类C以创建可以绑定到参数的隐式临时对象Test

编辑:我最接近的是friend void Test(int i) { }放入C. 这可以使用 Sun 的 CC 编译器进行编译,但无法使用 ideone 的 g++ 4.4、4.5 或 4.8 进行编译。EDIT2:从 11.4/5 看来,g++ 在这里是正确的:函数被引入类的范围,而不是封闭范围。

于 2013-09-03T15:00:27.757 回答
6

此任务无法回答,因为问题不在于 class C,而在于Test需要对 的非常量引用C

调用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);
于 2013-09-03T14:58:24.670 回答
1

http://ideone.com/pnZwh6怎么样? 这是一个 hack,但它可以让代码编译。

class C
{
public:
    C(int i) {}
    ~C() {}

#define C const C
};

void Test(C &c)
{
}

int main(int, char**)
{
    Test(1);
    return 0;
}
于 2013-09-03T16:47:52.140 回答