c++ - const 引用、作为参数的构造函数和可编译性

标签 c++ oop inheritance constructor g++

一位同事让我查看他正在编写的一些代码,并遇到了特定行的问题,编译器 (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/

相关文章:

c++ - avcodec_open2 方法中的 ffmpeg 内存泄漏

c++ - 将 gnuplot 5 窗口嵌入到 Gtkmm 3 中

c++ - 语法错误 : Array of Vectors in OO C++

python - 当我在 python 中使用 f 字符串时得到不同的输出

c# - 这是对静态方法的正确使用吗

java - 父类(super class)对子类对象的引用

c++ - 使用正向链接解决 bool 表达式

c++ - 如何确定符号链接(symbolic link)指向的文件路径?

java - 泛型问题java

c++ - 需要在后代 .h 文件中重新声明被覆盖的函数