2017-02-17 71 views
2

我對使用共享指針的if子句中的評估順序有疑問。關於使用共享指針的評估順序

假設我有以下

struct MyClass { 
    bool canUse(){ return false; } // dummmy value 
} 

std::shared_ptr<MyClass> myclass_ptr_; 

/// other code.. 

if(myclass_ptr_ && myclass_ptr_->canUse()) { 
    // do something 
} 

你知道,如果在這種情況下,C++總是保證myclass_ptr_myclass_ptr_->canUse()之前評估?

如果情況並非總是如此,myclass_ptr_可能由於某種原因而出現,並且未初始化,我冒着肯定會導致應用程序崩潰的風險。

當我運行這個應用程序似乎工作正常,但我只是想與某人確認,以避免發佈中的令人討厭的驚喜。

+1

'&&'的左操作數總是首先被評估。如果「false」,則不評估右操作數。除非你使用'&&'用戶定義的超載' – WhiZTiM

回答

3

你知道,如果在這種情況下,C++總是保證myclass_ptr_myclass_ptr_->canUse()之前評估?

是的。此案件不屬於order of evaluation,但short circuiting規則爲&&

從腳註this page

內置操作符& &和||執行短路評價(做 如果結果是 後知道評估第一不計算第二個操作數),但重載運算表現得像普通 函數調用,並始終評估兩個操作數

又讀Why there is no circuiting when these operators are overloaded

+1

@Jain:非常感謝。第二個評論是可能澄清我心中另一個疑問的那個。 –

+0

我很高興如果這有助於:) –