这里发生了什么?我将结果分配给 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)使用右值赋值,而不对运算符进行引用限定。这样会破坏现有的代码库。
你能告诉我这是怎么回事吗?为什么可能?
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)使用右值赋值,而不对运算符进行引用限定。这样会破坏现有的代码库。