编译器是否允许在重载解析期间选择const ref over ref?

时间:2012-03-17 20:47:25

标签: c++ optimization const overloading

一些背景知识:

前几天我遇到了一些让我想到嵌套函数调用中的重载解析的东西。请考虑以下代码:

#include <iostream>

void printer(const int &a)
{
  std::cout << a << "\n";
}

const int& func(const int &a)
{
  std::cout << "const int& ";
  return a;
}

int& func(int &a)
{
  std::cout << "int& ";
  return a;
}

int main()
{
  int a = 42;
  const int b = 21;
  printer(func(a));
  printer(func(b));

  return 0;
}

此代码打印

int& 42
const int& 21

所以,显然func(a)看到a是非const int。编译器还必须看到打印机函数需要const int&amp;论点。并且存在一个返回const int&amp;的func(...)。我查看了C ++标准,它说const refs和refs被认为是不同的参数类型(这就是为什么它为func(a)选择int&amp;)。

问题:

在调用func(a)时,是否允许编译器使用func(const int&amp;)版本而不是func(int&amp;)?

(如果它看到结果传递给想要const int&amp;参数的函数,则可能存在某种优化可能性。)

1 个答案:

答案 0 :(得分:5)

重载分辨率不考虑返回类型。也就是说,它只会查看函数的参数和不同的重载,而忽略了返回值的使用方式。

对于更明确的测试,请考虑将非常量重载更改为:

void func( int& ) {}

,即使存在允许代码编译的类似的重载,也无法编译。