2015-04-06 57 views
1

是否有可能以這樣的方式強制功能被稱爲賦值操作數只

auto i = foo.GetLock(); 

作品來聲明函數,但

foo.GetLock(); 

導致編譯錯誤?

我的界面有一個方法返回RIIA風格的鎖對象,我想確保沒有人決定調用GetLock()來鎖定鎖。

它曾經是這樣的

class CSomethingOrElse : private CLockable 
{ 
    ... 
} foo; 

CLocker<CSomethingOrElse> lock(foo); 

但它是我的口味太冗長,我真的想利用auto

+1

如果getLock返回一個在破壞時解鎖的類:它不會阻止非賦值調用,但它會阻止鎖定 – galinette 2015-04-06 13:00:23

+1

clang和gcc對此有一個警告(使用函數的返回值)。 (請參閱http://stackoverflow.com/questions/2870529/g-how-to-get-warning-on-ignoring-function-return-value) – Jarod42 2015-04-06 13:01:37

+0

@ Jarod42:但在這種情況下,您通常會發出大量警告,沒有?很多函數使用可選的返回值(例如流操作符等) – galinette 2015-04-06 13:03:42

回答

1

foo.GetLock();表達式語句,所以任何有效的表達式都可以這樣使用。你不能在編譯時禁止:你能得到的最好是一個警告。

假設你的對象釋放了對破壞的鎖定,那麼不會將結果存儲在變量中的調用不會是一個大問題,因爲鎖定會立即被獲取並釋放。

創建一個保護對象與您在解決方案中描述的類似,是正確的方法。事實上,C++的標準庫與std::lock_guard類似。