簡體   English   中英

有沒有辦法聲明該函數的輸入參數必須是const reference?

[英]Is there a way to declare that input parameter of the function must be const reference?

這樣做的動機是(很少)我需要知道類構造函數或函數的輸入參數通常是const。 通常,當該類是一個使某些過程“自動化”的助手時。
例:
這是從容器中獲取隨機元素的確定范圍的方法嗎?
如果您看一下代碼,很明顯,如果傳遞給構造函數的容器被更改,則類功能將被破壞。 因此,有一種方法可以使用函數“ demand” const而不是“ promise” const。

例:

int f(const vector<int>& v)
{
    return v.size();
}
int main()
{
    vector<int> v;
    v.push_back(42); // can f be changed to reject v because it is not const 
    cout << f(v);

}

聲明但不實現非const版本。

int f(vector<int>& v);

嘗試通過非常量向量的嘗試將被解析為該函數,然后您將收到鏈接器錯誤,因為不存在此類函數。

一些精美的模板游戲可能能夠將其轉換為編譯時錯誤。

沒有辦法保證這一點。 如果要確保對象不變,則該對象應歸類所有。 一種實現方法是將要保持常數的對象復制到類中,或者使用C ++ 11讓構造函數獲取右值引用並移動對象。

如果希望類中的某些屬性不受任何外部更改的影響,則應將它們由構造const TypeName _attr;復制到屬性const TypeName _attr;

我不認為有可能。

如果有可能,您仍然可以那樣做

Object mutable_;
const Object & notMutavle = mutable_;
func(notMutable);
mutable.change();

無論如何,即使const對象的狀態也可以更改,如果它具有一些mutable字段。

如果要確保沒有人更改對象,則應該自己進行管理。

您可以通過重載非常量引用的函數來實現。

下一個示例對此進行了演示。 但是,代替返回-1,f的第一個版本應該引發異常。

#include <vector>
#include <iostream>

int f(std::vector<int>& )
{
    return -1;
}
int f(const std::vector<int>& v)
{
    return v.size();
}
int main()
{
    std::vector<int> v;
    v.push_back(42); // can f be changed to reject v because it is not const
    std::cout << f(v)<<std::endl;

    const std::vector<int> cv(5);
    std::cout << f(cv)<<std::endl;
}

暫無
暫無

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

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