C++;按值类型和常量进行函数重载(完整详细信息) 在C++中,函数 f>代码>采用一个类型的代码< t>代码>可以有五个不同的签名(忽略< >易失性>代码>):

C++;按值类型和常量进行函数重载(完整详细信息) 在C++中,函数 f>代码>采用一个类型的代码< t>代码>可以有五个不同的签名(忽略< >易失性>代码>):,c++,c++11,overloading,C++,C++11,Overloading,假设上述5种方法中的一个子集在程序中实现。编译器在选择实现的重载时遵循的完整规则是什么 我希望能够特别了解以下情况: 对声明为T,const T,T&,const T&,T&,T&的变量调用f 函数的输出声明为返回T,const T,T&,const T&,T&,T&,const T& PS:我已经找到了一个关于没有case#0的情况下发生的事情的合理完整的描述,但是我想知道当你把它放到混合中时会发生什么 PS2:这个问题背后的原因是,我经常发现自己在做测试,以找出这种过载解决方案在某些特定

假设上述5种方法中的一个子集在程序中实现。编译器在选择实现的重载时遵循的完整规则是什么

我希望能够特别了解以下情况:

  • 对声明为
    T
    const T
    T&
    const T&
    T&
    T&
    的变量调用
    f
  • 函数的输出声明为返回
    T
    const T
    T&
    const T&
    T&
    T&
    const T&
PS:我已经找到了一个关于没有case#0的情况下发生的事情的合理完整的描述,但是我想知道当你把它放到混合中时会发生什么

PS2:这个问题背后的原因是,我经常发现自己在做测试,以找出这种过载解决方案在某些特定情况下是如何工作的。尽管您总是可以通过测试来解决每个特定的情况,但是一劳永逸地了解一般规则会很好


编辑摘要:明确忽略了volatile,并澄清了只能实现0-5的子集。

这是不可能的<代码>常量和&没有意义

struct T{};

void f(T) {}
void f(const T&) {}

int main() {
    T t;
    f(t);
}

原因
错误:对“f”的调用是不明确的

对于右值引用,您可以看看Thomas Becker的这篇文章。似乎运行一些测试并查看调用哪一个测试是相当容易的。有没有什么特别的原因让你自己不能这样做;f(t)将向您显示前三个明显不明确…
void f(const t&&)没有多大意义。@PaulSanders
const t&&
是一个有效类型,尽管在实践中不是很有用
const t&&
是一个有效类型,尽管不是很有用。我知道#0与他人发生冲突,知道他们如何/何时发生冲突是我希望的一部分know@GiorgioAudrito编译器不知道应该调用哪个函数
t
是这两个函数的有效参数。@ThomasSablik不仅有效,而且两个符号之间的匹配性都不是很重要。@ThomasSablik回答了重载子集{t,const t&}的情况和使用变量T调用。但是,有2^5*12-1=383个其他可能的重载子集和调用来区分;因此,它如何工作的一般规则是nice@GiorgioAudrito一般的经验法则是不提供每一个可能的过载只是为了提供它,并且在处理这些情况时,考虑完美的转发而不是创建一堆过载可能是个好主意。
struct T{};

void f(T) {}
void f(const T&) {}

int main() {
    T t;
    f(t);
}