2017-02-17 33 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.

Builtin операторы & & и || выполняют оценку короткого замыкания (сделать не оценивает второй операнд, если результат известен после оценки первого), но перегруженные операторы ведут себя как обычные вызовы функции и всегда оценивают оба операнда

также прочитать Why there is no circuiting when these operators are overloaded.

+1

@Jain: спасибо большое. Второй комментарий - тот, который, вероятно, объясняет еще одно сомнение, которое я имел в виду. –

+0

Я рад, если это помогло :) –