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

What is going on here? I assign result to result in C++

你能告诉我这是怎么回事吗?为什么可能?

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

我认为 make_unique 返回了一个 r 值...

编辑: 您能否提供一些有关此构造的有用示例?

I thought that return of make_unique is r-value...

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


例如,当您检查 std::bitset 时,您会发现它的 reference 类型实际上是 class 类型。该类型的赋值运算符已重载。它接受 bool,但实际上执行按位操作来操作 bitset.

的打包内存中的标志。

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

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)使用右值赋值,而不对运算符进行引用限定。这样会破坏现有的代码库。