这里发生了什么?我将结果分配给C++中的结果

Bar*_*kPL 9 c++ unique-ptr c++14

你能告诉我这里发生了什么吗?为什么有可能呢?

std::make_unique<int>(1) = std::make_unique<int>(1);
Run Code Online (Sandbox Code Playgroud)

我以为这make_unique返回了一个r值......

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

Sto*_*ica 10

我认为make_unique的回归是r值...

它是.但对于类类型std::unique_ptr<...>,赋值是对重载成员函数的调用.您可以将rvalues作为参数传递给函数.更具体地说,在rvalues上调用成员函数.


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


它适用于unique_ptrrvalues,因为它是重载的(并且是为其他类类型隐式生成的),没有任何ref-qualifiers.即

unique_ptr& operator=( unique_ptr&& r ) noexcept;
Run Code Online (Sandbox Code Playgroud)

... 并不是...

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

哪个收益很少.并且隐含生成的那个不太可能仅适用于左值.许多代码(有些甚至早于C++ 11)在rvalues上使用赋值,而无需对运算符进行ref-qualified.这样就会破坏现有的代码库.

  • @bartop - Code需要保护用户不受Murphy的影响,而不是Machiavelli. (6认同)
  • @StoryTeller但是等一下.我同意对某些r值可能有意义.它只是不同意它对"unique_ptr"有意义 (2认同)