簡體   English   中英

奇怪的C ++模板和const問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM