怪异的C ++模板&常见问题

时间:2011-09-16 07:28:07

标签: c++ templates

我不明白为什么这个程序的输出是第二种方法而不是第一种方法 ......

#include <iostream>

template <class T>
void assign(T& t1,T& t2){
    std::cout << "First method"<< std::endl;
}

template <class T>
void assign(T& t1,const T& t2) {
    std::cout << "Second method"<< std::endl;
}

class A
{
public:
    A(int a):_a(a){};
private:
    int _a;
    friend A operator+(const A& l, const A& r);
};

A operator+(const A& l, const A& r) {
friend A operator+(const A& l, const A& r);return A(l._a+r._a);
}

int main ()
{
    A a=1;
    const A b=2;
    assign(a,a+b);
}

然而,当我将主要功能更改为:

int main ()
{
    A a=1;
    const A b=2;
    A c=a+b;
    assign(a,c);
}

输出第一种方法。 有什么想法吗?

2 个答案:

答案 0 :(得分:15)

assign( a, a+b );

a + b的结果是类型为A rvalue表达式,它创建了一个临时的,你不能将它绑定到非const引用,所以它选择了const重载,因为您可以将const引用绑定到临时。

assign( a, c );

在这种情况下,子表达式c左值表达式,您可以绑定非const引用。在这种情况下,因为非const版本与T=A完全匹配,所以优先于const重载,需要在类型为A <的左值的第二个参数中进行转换/ em>到 A 类型的const左值。

答案 1 :(得分:5)

你职能部门的

&t2正在参考。

但是,a+b无法绑定到普通引用,因此必须将其作为const引用传递。

在你的第二个main中,你传递了一个合适的左值,因此它可以被函数修改(因此const可能会改变含义)。

这是我的猜测,至少。