C++ - How does the compiler decide between overloaded functions with reference types as parameter?(C++-编译器如何决定使用引用类型作为参数的重载函数?)
本文介绍了C++-编译器如何决定使用引用类型作为参数的重载函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在学习C++时,我遇到了转换序列这个复杂的主题,我遇到了一个我自己解决不了的问题。
void g(const double)
{
std::cout << "void g(const double)" << std::endl;
}
void g(const double&&)
{
std::cout << "void g(const double&&)" << std::endl;
}
int main(int argc, char **argv)
{
g(3.14);
return (0);
}
-第二个示例
void g(const double)
{
std::cout << "void g(const double)" << std::endl;
}
void g(const double&)
{
std::cout << "void g(const double&)" << std::endl;
}
int main(int argc, char **argv)
{
g(3.14);
return (0);
}
在这两个示例中,编译器报告重载函数"g(Double)"的调用不明确。
void g(const double&&)
{
std::cout << "void g(const double&&)" << std::endl;
}
void g(const double&)
{
std::cout << "void g(const double&)" << std::endl;
}
int main(int argc, char **argv)
{
g(3.14);
return (0);
}
但在本例中,程序编译正确并打印出"void g(const double&;&;)"。
所以我不明白为什么编译器会抱怨前两个示例,而不会抱怨第三个示例。
推荐答案
重载解析表
此表汇总了哪些人可以去哪里:
---------------------------------------------------------------------------------
Caller | lvalue | const lvalue | rvalue | const rvalue
Function | | | |
---------------------------------------------------------------------------------
[a] f(X& x) | V (1) | | |
---------------------------------------------------------------------------------
[b] f(const X& x) | V (2) | V | V (3) | V (2)
---------------------------------------------------------------------------------
[c] f(X&& x) | | | V (1) |
---------------------------------------------------------------------------------
[d] f(const X&& x) | | | V (2) | V (1)
---------------------------------------------------------------------------------
- 以上所有签名都可以共存。
- V符号标记可能的有效解决方案
- 如果同一调用方有多个有效解析,则会对它们进行编号,(1)比(2)更匹配,依此类推。
- 使用上述任何一项重载val版本都没有意义,除非在方法上有其他差异,如const等。 添加BYVALE版本:F(X X)不能很好地与以上任何组合一起使用-在大多数情况下,它会导致任何调用的模糊性,对于某些情况,它只会更喜欢BYVAL版本(如果它只与[a]一起存在-除lvalue之外的任何调用都将首选BYVALE版本,而lvalue调用将导致歧义)。
- 签名[d]很少使用,请参阅:Do rvalue references to const have any use?
这篇关于C++-编译器如何决定使用引用类型作为参数的重载函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:C++-编译器如何决定使用引用类型作为参数的重载函数?
基础教程推荐
猜你喜欢
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01