我已经在 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();