[英]Weird C++ template & const problem
我不明白為什么這個程序的輸出是Second Method而不是First Method ...
#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);
}
輸出為First方法 。 有任何想法嗎?
assign( a, a+b );
a + b
的結果是A
類型的右值表達式 ,該值創建了一個臨時對象,您無法將其綁定到非const引用,因此,由於允許將const引用綁定到臨時對象,因此它會拾取const
重載。
assign( a, c );
在這種情況下,子表達式c
是一個左值表達式 ,您可以綁定非常量引用。 在這種情況下,因為非const版本與完美匹配T=A
優選在常量過載,將需要從類型的左值中的第二個參數的變換A
到類型的常量左值A
。
您的函數中的&t2
正在作為參考。
但是, a+b
不能綁定到普通引用,因此必須將其作為const
引用傳遞。
在您的第二個main
函數中,您傳遞了適當的左值,因此可以通過函數進行修改(因此const
可能會更改含義)。
至少那是我的猜測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.