Files
Obsidian-Main/02. PARA/03. Resources(資源)/C++17/rvalue.md
Awin Huang d89c1072d4 vault backup: 2022-06-08 11:05:41
Affected files:
02. PARA/03. Resources(資源)/C++17/rvalue.md
2022-06-08 11:05:41 +08:00

28 lines
1.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
- 等號右邊的值
- 臨時的值,例如運算的結果
- 無法被取址address-of的物件
# rvalue參考
可以用`&&`來參考rvalue。例如
```
int c{5};
int&& rtepm {c + 3};
```
關於lvalue、rvalue的分別可以參考[Value categories - cppreference.com](https://en.cppreference.com/w/cpp/language/value_category),或是[rvalue 參考](https://openhome.cc/Gossip/CppGossip/RvalueReference.html)等文章。這邊講用法跟好處。
rvalue reference可以減少無間的複製成本。例如
```cpp
std::string longStr = "qwertyuiopasdfghjklzxcbnm";
std::string anotherLong = longStr;
```
這時longStr會被複製一份anotherLong把longStr換成很大的buffer其複製成本就更大了。用rvalue reference可以消除這個複製成本。如下
```cpp
std::string longStr = "qwertyuiopasdfghjklzxcbnm";
std::string&& anotherLong = longStr;
std::cout << anotherLong; // "qwertyuiopasdfghjklzxcbnm"
//std::cout << longStr; // Undefined bahavior, don't do this
```
上面的例子longStr的內容被「轉移」給anotherLong所以不可以再longStr這時候longStr的內容取決於move operator的作法。
不過