2012-02-01 54 views
0

對此的動機是(很少)我需要知道類構造函數或函數的輸入參數通常是const。通常當這個類是一個「自動化」某個過程的助手時。
例子:
Is this the OK scoped way to get random element from the container?
如果你在看代碼很顯然,如果傳遞給構造方法的容器改變後級的功能被破壞。那麼有沒有辦法讓函數「demand」const而不是「promise」const。有沒有辦法聲明函數的輸入參數必須是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); 

} 
+0

我不明白 - 如果該參數被聲明爲'const'引用,那麼這是一個承諾*和*需求,不是嗎? – 2012-02-01 17:14:28

+0

INT F(常量矢量&V) { \t返回v.size(); } INT主() { \t 向量V; \t v.push_back(42); \t cout << f(v); } v是不const的,在f拒絕非const輸入PARAMS又名要求常量輸入參數 – NoSenseEtAl 2012-02-01 17:19:08

+0

我意識到,在回家的路上 - 忽略我先前的評論,這是無稽之談。 – 2012-02-01 21:38:25

回答

5

聲明但不實現非const版本。

int f(vector<int>& v); 

試圖通過一個非const矢量將被解析爲這個功能,然後因爲沒有這樣的功能存在,你會得到一個連接錯誤。

一些花哨的模板遊戲也許能夠把它變成一個編譯時錯誤。

+0

只是爲了確保我是否理解正確 - 這隻能用於普通功能,而不能用於模板? – NoSenseEtAl 2012-02-05 21:18:21

+0

我看不出爲什麼它不適用於模板。 – 2012-02-05 21:21:56

0

如果你想內部類的一些屬性是安全的,他們應該通過構造被複制的屬性const TypeName _attr;任何外部變化。

2

沒有辦法保證。如果你想確定這個對象沒有改變,它應該歸類。一種方法是將要保持常量的對象複製到類中,或者如果使用C++ 11讓構造函數採用右值引用並移動該對象。

0

我不認爲,這是可能的。

如果有可能,你仍然可以做這樣的

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

無論如何,即使const對象的狀態可以改變可能的,如果它有一些mutable精密組件。

如果你想確保,沒有人改變你的目標,你應該自己管理。

0

你可以通過重載非const引用的函數來實現。

下面的例子說明了這一點。但是,不是返回-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; 
} 
相關問題