奇怪的C++模板和const问题

And*_*zej 7 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);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我将主要功能更改为:

int main ()
{
    A a=1;
    const A b=2;
    A c=a+b;
    assign(a,c);
}
Run Code Online (Sandbox Code Playgroud)

输出是First方法.有任何想法吗?

Dav*_*eas 15

assign( a, a+b );
Run Code Online (Sandbox Code Playgroud)

结果a + b是一个rvalue表达式,A它创建一个临时的,你不能将它绑定到一个非const引用,所以const当你被允许将一个const引用绑定到一个临时引用时,它会获取重载.

assign( a, c );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,子表达式c是一个左值表达式,您可以绑定非const引用.在这种情况下,因为非const版本与完美匹配T=A,优选在过载常量,将需要来自在第二个参数的变换类型的左值A类型的常量左值A.


man*_*nge 5

&t2 在你的功能中正在参考.

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

在你的第二个main你传递一个适当的左值,所以它可以被函数修改(因此const可能会改变意义).

这是我的猜测,至少.