正如下面的代码,我不明白为什么!p
是legail,因为std::unique<T>
没有成员函数"运算符!(("。
由于std::cout << p.get() << std::endl;
是合法的,我认为p
是一个对象,而不是一个指针。所以我很困惑。
有人能帮我一个忙吗?
std::cout << "unique ownership semantics demon";
{
auto p = std::make_unique<D>();
std::cout << p.get() << std::endl; //I think p is an object, not an pointer.
auto q = pass_through(std::move(p));
assert(!p); //Why it is legial?
q->bar();
}
编译!p
时,编译器隐式调用unique_ptr<T>
具有的operator bool
,然后否定它。
有关更多详细信息,请参阅此处。
!p
是合法的,因为有一个明确定义的函数可以将unique_ptr
转换为bool
。
见 https://en.cppreference.com/w/cpp/memory/unique_ptr/operator_bool
explicit operator bool() const noexcept;
!p
被翻译为!(p.operator bool())
.
要回答您的其他问题:
std::cout << p.get() << std::endl;
工作是因为
get()
返回unique_ptr
持有的指针operator<<
有一个重载,它接受void*
指针作为输入- 任何指针都可以隐式转换为
void*
。
p
确实是一个对象,而不是一个指针。但get()
返回一个指针。