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

C++ 在重载解析期间,是否允许编译器选择const ref over ref?,c++,optimization,constants,overloading,C++,Optimization,Constants,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&

一些背景:

前几天我遇到了一些事情,让我想到了嵌套函数调用中的重载解析。考虑下面的代码:

#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;
}
显然,func(a)看到a是一个非常量int。编译器还必须看到打印机函数需要一个常量int&参数。还有一个func(…)返回常量int&。我研究了C++标准,它指出const REFS和REFs被认为是不同的参数类型(这就是为什么它选择int和FUNC(a))。 对该问题:

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


(如果看到结果传递给一个需要cont int和参数的函数,可能存在某种优化可能性)

过载解析不考虑返回类型。也就是说,它将只查看函数的参数和不同的重载,而不考虑如何使用返回值

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

void func( int& ) {}

编译失败,即使有不同的类似超载,允许代码编译。

过载解决方案不考虑返回类型。也就是说,它将只查看函数的参数和不同的重载,而不考虑如何使用返回值

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

void func( int& ) {}

它将无法编译,即使存在允许代码编译的其他类似重载。

我很快注意到并删除了我的注释。你的回答很正确。我很快注意到了,并删除了我的评论。你的回答恰到好处。