簡體   English   中英

為什么我不能從這個模板函數返回引用?

[英]Why can't I return a reference from this template function?

我直接從一本書( Sams每天一小時教你自己C ++)中拿出這個例子:

// Get the maximum of two values
template <typename objectType>
objectType& GetMax(const objectType& value1, const objectType& value2)
{
    if (value1 > value2)
        return value1;
    else
        return value2;
}

本質上,它是一個非常詳細的模板函數,用於查找任何類型的2個值之間的最大值。

我試圖使用如下函數:

// Test the Max function
int x_int = 25;
int y_int = 40;
int max_int = GetMax(x_int, y_int);
cout << "max_int: " << max_int << endl;

double x_double = 1.1;
double y_double = 1.001;
double max_double = GetMax(x_double, y_double);
cout << "max_double: " << max_double << endl;

但是,當我嘗試編譯並運行代碼時,我收到以下錯誤:

錯誤1錯誤C2440:'return':無法從'const int'轉換為'int&'

錯誤2錯誤C2440:'return':無法從'const int'轉換為'int&'

錯誤3錯誤C2440:'return':無法從'const double'轉換為'double&'

錯誤4錯誤C2440:'return':無法從'const double'轉換為'double&'


如果我只是從函數的返回類型中刪除& ,它將編譯並成功執行。

為什么我不能從這個函數返回一個引用? 這本書是錯的,還是我錯過了什么?

這里的問題是參數聲明的const部分。 變量value1value2是對量值的引用,但是返回對非常量值的引用。

錯誤解釋了這一切,您不能返回const引用的非const引用。

// Get the maximum of two values
template <typename objectType>
const objectType& GetMax(const objectType& value1, const objectType& value2)
{
    if (value1 > value2)
        return value1;
    else
        return value2;
}

您應該指出錯誤引用的行(以及發布其他人可以復制/粘貼到其編輯器中的完整程序)。

但我希望他們能參考這一行

return value1;

和之后的類似之一。 錯誤告訴你到底出了什么問題:

cannot convert from 'const int' to 'int &'

當然,如果我們調查這條線試圖做的細節,我們會發現你想要返回的東西是const:

const objectType& value1

但函數承諾返回的類型是一個nonconst引用:

objectType& GetMax

函數GetMax的返回類型是一個引用,但是您嘗試返回一個const引用的變量。

這是不允許的,編譯失敗。

試圖在value1value2上使用const_cast來繞過這種機制是危險的,因為從最初的const值中刪除const的行為是未定義的。

顯而易見的事情是將GetMax的返回類型更改為const引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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