gcc-4.8 (Coliru 経由) および Visual Studio 2013 RC で次のプログラムをテストしました。
#include <iostream>
#include <functional>
using namespace std;
struct foo {
void bar() {
cout << "this = " << this << endl;
}
};
int main() {
try {
foo *ptr = nullptr;
function<void ()> fun = bind(&foo::bar, *ptr);
fun();
} catch (const bad_function_call &e) {
// never reached
cout << "bad_function_call thrown: " << e.what() << endl;
}
cin.get();
}
ここで nullptr を逆参照することで未定義の動作を引き起こしていることは理解していますが、コードの出力はわかりません。私の理解では、これは bad_function_call を引き起こす必要があります (これは、私が推測したことから、この std::function を呼び出すときにスローされる必要があるためです) か、少なくとも「this = 0」を出力する必要があります。
そうではありません。出力は、「this =」であり、その後に、テストした両方のコンパイラで nullptr ではないポインターが続きます。ただし、アクセスするとセグメンテーション違反が発生します。
これを指定する標準の条項はありますか? それとも、実装定義の「未定義の動作」ですか?
編集:追加として:次のコードは、私のマシンで「this = 0」を出力します:
foo *ptr = nullptr;
ptr->bar();