gpt4 book ai didi

c++ - 是否允许编译器在重载解析期间选择 const ref 而不是 ref?

转载 作者:行者123 更新时间:2023-11-30 01:26:45 27 4
gpt4 key购买 nike

一些背景:

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

#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 是一个非常量 int。编译器还必须看到打印机函数需要一个 const int& 参数。并且存在一个返回 const int& 的 func(...)。我研究了 C++ 标准,它说 const refs 和 refs 被认为是不同的参数类型(这就是它为 func(a) 选择 int& 的原因)。

问题:

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

(如果它看到结果被传递给需要 const int& 参数的函数,也许有某种优化的可能性。)

最佳答案

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

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

void func( int& ) {}

这将无法编译,即使存在允许代码编译的不同类似重载也是如此。

关于c++ - 是否允许编译器在重载解析期间选择 const ref 而不是 ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com