给定声明 'std::unique p<T>;',为什么 '!p' 是 legail 因为没有记忆函数 'operator !()' 'std::unique<T>



正如下面的代码,我不明白为什么!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()返回一个指针。

相关内容

  • 没有找到相关文章

最新更新