最近、返された空のshared_ptrを使用すると、奇妙な動作に気づきました。問題を説明するために、次の例を検討してください。
struct A {
A() { }
void foo() {
std::cout << "A::foo" << std::endl;
}
};
struct B {
B() :i(42) { }
void foo() {
std::cout << "B:foo with i: " << i << std::endl;
}
int i;
};
template<typename T>
std::shared_ptr<T> create_empty() {
return std::shared_ptr<T>();
}
次に呼び出します:
std::shared_ptr<A> pa(create_empty<A>());
pa->foo(); // #1: Works fine and prints: "A::foo".
std::shared_ptr<B> pb(create_empty<B>());
pb->foo(); // #2: Throws an exception.
ここで私の質問は、なぜ呼び出し#1が機能するのか(私も例外が発生することを期待していました)、これが正しい動作である場合、#1が機能しないようにする方法です。戻り値が空かどうかを確認する必要がありますか?nullまたは空のshared_ptrを返す他の方法はありますか?それが重要な場合、私はMSVC++11を使用しています...