&&
true が返されたstd::string().size()
場合にのみ評価されます。g()
IOWg()
が true を返さなかった場合、一時的な文字列を破棄するタイミングに問題はありません。そもそも一時的な文字列が作成されることはないためです。
たとえば、次のようなコードがあるとします。
#include <iostream>
#include <stdlib.h>
bool g() { return rand() & 1 == 0; }
void f(bool val) {
std::cout << std::boolalpha << val;
}
int main(){
f(g() && std::string().size() == 0);
}
VC++ は、一時変数が生成されたかどうかを追跡する一時変数を使用するコードを$T1
生成し、真の場合にのみ一時変数を破棄する$T1
ため、シーケンスは次のようになります。
int $T1 = 0
call g()
if (retval == 0)
goto $LN3
call std::string::string()
$T1 = true;
call temp_string.size();
if (retval != 0)
goto $LN3
$TV74 = 1
goto $LN4
$LN3 :
$TV74 = 0
$LN4 :
call f($TV74);
if ($T1 == 0)
goto $LN7
call std::string::~string();
$LN7:
return 0;
アセンブリ言語からこの疑似コードに翻訳し直す際に、無関係な詳細をいくつか省略しましたが、必要に応じて元のフローと比較するのが非常に簡単になるように、元のフローと十分に類似した名前を保持しています。