例外安全という言葉には色々と含まれるけど、
とりあえず最低限度の保証としては「リソースリークが起こらないこと」とすると、
C++ ではデストラクタで後始末するのが基本だ。
(RAII)

私が強調しておきたいのは、リソース管理の配慮はクラス定義に押し込めることが出来るということと、
可能な限り押し込めるべきだということ。

エラー発生の通知に使うのが返却値であれ例外であれ、
エラーへの対処の中にリソース回収のコードを書かなきゃならないようならその時点でダメなコードだ。
デストラクタで回収されることをあてにしたい。
(bad_alloc のような致命的なやつはちょっと話が違ってきたりとか、単純ではない場面はあるけど……。)

で、デストラクタでリソースを後始末するというのが出来ているという前提であれば、
例外を使うか返却値を使うかの差は対処のためのコードをどこにかくかの違いに過ぎなくなる。
Java と違って関数が送出する例外を型システムで管理してくれないわけだし、
引数をチェックしているかどうかもプログラマが気を付けるしかないので、そんなに違いはないと思う。

違いはないがどちらかに一貫させるのが望ましいと考えると、
C++ の基本的なライブラリに併せるべきだということになって例外を使うのが妥当という判断になる。

ちなみにグーグルのガイドラインが例外を避けることになっているのは
グーグルで使っている既存のコードが例外への配慮を充分にしてないから
やむを得ずそれに合わせるためでフルスクラッチに出来れば違う判断をするかも
ってことも書いてあるので、例外を避ける根拠としては弱い。