后,我不明白为什么这个代码工作:使用的unique_ptr移动
class Base {
public:
virtual void doStuff() const{}
Base(Base & b) = delete;
Base() {
cout << "Base" << endl;
}
~Base() {
cout << "~Base" << endl;
}
friend ostream& operator<<(ostream& out, const Base& a) {
return out << "me";
}
};
int main(){
unique_ptr<Base> pt = make_unique<Base>();
auto npt = move(pt);
auto &a = *pt;
if (pt == nullptr)
cout << "yes nullptr" << endl;
cout << a << endl;
}
在Visual Studio 2015年的产量为:
Base
yes nullptr
me
~Base
所以它不会崩溃和pt
甚至可用被移出后。 在coliru在线编译器中,它在cout << a << endl;
处崩溃。我不明白它如何不会在行auto &a = *pt;
处崩溃,因为此时pt等于nullptr,并且命令auto &refToNull= nullptr;
是编译错误。
我将不胜感激关于发生了什么的澄清。
未定义的行为未定义。 – songyuanyao
你忘记你的'operator <<'函数是*不是成员函数*。这是一个全球性的非会员功能。尝试调用一个实际的成员函数,或者改为访问一个成员变量。 –
_So它不会粉碎,'pt'在被移出后甚至可以使用。谁说它应该总是崩溃?这是未定义的行为。 –