2012-10-02 59 views
9

有沒有辦法在C++中強制賦值函數的返回值? 也就是說,如果我有一個成員函數foo強制返回的對象被分配

class myClass{ 
    ... 
    public: 
    T1 foo(T2 x){T1 y; /*something*/ return y;}; 
} 

,我可以在main()作爲

myClass obj; 
T1 a = obj.foo(x); //<-- 

我可以做簡單的通話

myClass obj; 
obj.foo(x); //<-- 

調用(即不存儲返回值)以某種方式「非法」?

或者,我可以分辨的

T1 a = obj.foo(x); 
obj.foo(x); 

的定義感謝您的時間,對不起我的無知

+1

丟棄返回值沒有什麼特別的錯誤。另外,即使有這樣的方法 - somefunc(obj.foo(x))''怎麼辦? – Cubic

+0

你想達到什麼目的? –

回答

3

沒有,有沒有辦法強迫返回的對象上的操作。

不,你不能區分

T1 a = obj.foo(x); 
obj.foo(x); 

調用內部之間 (至少不是在便攜式,標準的方式,你可以與呼叫棧和這樣的謬以千里,但爲什麼你會) 。

2

有沒有辦法告訴,但良好的靜態分析工具通常會顯示警告,如果返回值被忽略。我使用的是MSVC2010自帶的那個。

3

簡單的答案是否定的;但是你可以「強制它」:

返回智能指針,當沒有任何引用時會自動銷燬。在析構函數中拋出一些異常或進行assert()調用。爲了防止在正確使用時發生崩潰,可以在該類中使用某個變量,並在確定不需要對象時將其設置爲false,這會告訴析構函數不會拋出任何東西。

+2

這種機制很好,但當然是一種「運行時」檢查。 非常感謝你順便說一句。 – Acorbe

7

如果你使用G ++,你可以使用

T1 foo(T2 x) __attribute__ ((warn_unused_result)); 

這將導致一個警告,雖然,不是一個錯誤。但是你可以使用一些-Werror = *標誌將它變成一個錯誤。有關所有支持的功能屬性,請參閱here

+0

這非常接近我所需要的。雖然我可能有點不可移植。我會以這種方式探索btw。謝謝。 – Acorbe