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.这样就会破坏现有的代码库.