【问题标题】:What is going on here? I assign result to result in C++这里发生了什么?我将结果分配给 C++
【发布时间】:2018-12-12 19:35:47
【问题描述】:

你能告诉我这里发生了什么吗?为什么会这样?

std::make_unique<int>(1) = std::make_unique<int>(1);

我以为make_unique 返回了一个右值...

编辑: 你能提供一些关于这种结构的有用例子吗?

【问题讨论】:

标签: c++ c++14 unique-ptr


【解决方案1】:

我以为 make_unique 的返回值是 r-value...

是的。但是对于像std::unique_ptr&lt;...&gt; 这样的类类型,赋值是对重载成员函数的调用。您可以将右值作为参数传递给函数。更具体地说,在右值上调用成员函数。


例如,当您检查std::bitset 时,您会看到它的reference 类型实际上是一个类类型。该类型的赋值运算符被重载。它接受bool,但实际上执行按位操作来操作bitset 的压缩内存中的标志。


它适用于unique_ptr 右值,因为它在没有任何引用限定符的情况下被重载(并且为其他类类型隐式生成)。即

unique_ptr& operator=( unique_ptr&& r ) noexcept;

...而不是...

unique_ptr& operator=( unique_ptr&& r ) & noexcept;
// Can only be used on lvalues, no overload for rvalues

这本来是没有什么收获的。而且隐式生成的不太可能只用于左值。很多代码(有些甚至早于 C++11)对右值使用赋值,而没有对运算符进行 ref 限定。所以这会破坏现有的代码库。

【讨论】:

  • 好问题是:为什么不删除 r 值的赋值运算符?我想这是标准中的一个忽视
  • “调用重载的成员函数”?这是什么意思?哪里超载了?
  • @bartop - 因为分配给 r 值实际上是有用的。例如,如果您返回具有重载赋值的代理对象。
  • @StoryTeller 但是请稍等。我同意对于某些 r 值可能有意义。它只是不同意这对unique_ptr 有意义
  • @bartop - 代码需要保护用户免受墨菲的伤害,而不是马基雅维利。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2013-11-03
  • 2014-02-03
相关资源
最近更新 更多