【发布时间】:2014-07-24 14:49:54
【问题描述】:
我有以下代码:
#include <iostream>
template <typename T>
void f(T& x)
{
std::cout << "f(T& )" << std::endl;
}
template <typename T>
void f(const T& x)
{
std::cout << "f(const T& )" << std::endl;
}
int main()
{
int a = 0;
const float b = 1.1;
f(a); // call f(T&)
f(b); // call f(const T&)
}
输出是:
f(T& )
f(const T& )
我的问题是:编译器如何知道要调用哪个函数?如果我从函数定义中删除引用,则会收到“模糊调用”类型的错误,即error: redefinition of 'f'。对我来说,f(T&) 看起来可以同样很好地用于两个调用,为什么 const 版本明确地调用 f(b)?
【问题讨论】:
-
我正在阅读 C++ Primer 5th Edition atm。它在书中说 const 引用实际上是对常量变量的引用。因此,调用
f(b)其中b是const float,它将调用f()的const 变体 -
你的意思是 pass by value 而不是 reference 会产生歧义?
-
@AlexYan 好吧,它只是一个
const引用,仅此而已,即您可以将非常量传递给它,但您将无法修改传递的对象。不知道是不是这个原因。 -
dansaks.com/articles/… 解释了为什么一个有效而另一个无效。重载必须以这种方式工作:如果参数是按值复制的,那么它是 const 对象的副本还是非常量对象的副本都没有区别,它是一个单独的对象。当参数是引用时,它是否引用 const 对象非常重要。
标签: c++ pass-by-reference