一位同事让我查看他正在编写的一些代码,并遇到了特定行的问题,编译器 (g++) 会提示函数调用没有基于其参数的匹配函数。
在用两种方法解决了这个问题之后(一种是将参数移到它自己的变量中并传递它,另一种是更改参数列表以将其作为 const 引用),我不得不问这个问题:为什么解决办法是怎样的?正如我的同事所说,我不满意将其注销,就好像一些构造函数细节被隐藏了一样。
因此,我将问题复制并简化为以下内容(使用 g++ -Wall -ansi -pedantic 编译):
class SomeClass
{
public:
static void SomeFunction(SomeClass& sc) {}
static void SomeFunction2(const SomeClass& sc) {}
};
class SomeChild : public SomeClass {};
void testOne(void)
{
// this compiles
SomeChild sc = SomeChild();
SomeClass::SomeFunction(sc);
// this doesn't compile
//SomeClass::SomeFunction(SomeChild());
}
void testTwo(void)
{
// this compiles
SomeChild sc = SomeChild();
SomeClass::SomeFunction2(sc);
// this compiles
SomeClass::SomeFunction2(SomeChild());
}
int main(void)
{
testOne();
testTwo();
return 0;
}
我可能在这里遗漏了一些非常基本的东西,但是谁能向我解释为什么编译器认为没有对不可编译行的匹配函数调用?
提前致谢。
最佳答案
原因很简单,临时值,例如 SomeChild()
的值,不能绑定(bind)到非常量左值引用。虽然这没有深层次的技术原因,但这是一种设计选择:非常量引用通常用于修改被引用的东西,如果那个东西是临时的,那么修改基本上不会产生持久的效果,这几乎是总是逻辑错误。
关于c++ - const 引用、作为参数的构造函数和可编译性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19744381/