C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- std::apply
- åºç¹æ§æµè¯å® (C++20)
- ç¨åºæ¯æå·¥å ·
- std::initializer_list
- 彿°å¯¹è±¡
- std::hash
- std::pair
- std::tuple
- std::optional
- std::any
- std::variant
- æ ¼å¼ååº (C++20)
- std::integer_sequence
- std::exchange
- std::make_from_tuple
- std::launder
- std::to_chars
- std::from_chars
- std::as_const
- std::source_location
- å忰彿°
- std::bitset
- std::cmp_equal, cmp_not_equal, cmp_less, cmp_greater, cmp_less_equal, cmp_greater_equal
- std::in_range
- std::declval
- std::forward
- std::move
- std::move_if_noexcept
- std::chars_format
- std::piecewise_construct_t
- std::piecewise_construct
- std::in_place, std::in_place_type, std::in_place_index, std::in_place_t, std::in_place_type_t, std::in_place_index_t
- 注é
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >å·¥å ·åº > std::launder
std::launder
| å®ä¹äºå¤´æä»¶ <new>
|
||
| template <class T> constexpr T* launder(T* p) noexcept; |
(C++17 èµ·) (C++20 å) |
|
| template <class T> [[nodiscard]] constexpr T* launder(T* p) noexcept; |
(C++20 èµ·) | |
è·å¾æåä½äº p æè¡¨ç¤ºå°åç对象çæéã
æ£å¼èè¨ï¼ç»å®
- 表示å
åä¸ä¸ä¸ªåèçå°å
Açæép - ä¸ä¸ªä½äºå°å
Aç对象X -
Xå¨å ¶çåæå -
Xçç±»åä¸Tç¸åï¼å¿½ç¥æ¯å±ç cv éå®ç¬¦ - è½éè¿ç»æè§¦åçæ¯ä¸ªåèé½è½éè¿ p 触åï¼è¥åèå¨ä¸
Yæéå¯äºè½¬æ¢ç对象Zçåå¨å ï¼æå¨ä»¥Z为å ç´ çç«å³å¤å´æ°ç»å ï¼åè½éè¿æå对象Yçæé触åè¿äºåèï¼
å std::launder(p) è¿å T* ç±»åçå¼ï¼å®æå对象 X ãå¦åè¡ä¸ºæªå®ä¹ã
è¥ T æ¯å½æ°ç±»åæï¼å¯æ cv éå®çï¼ void åç¨åºä¸ºç
å¼ã
è¥åæ°çå¼å¯ç¨äºæ ¸å¿å¸¸é表达å¼ï¼å std::launder å¯ç¨äºæ ¸å¿å¸¸é表达å¼ã
注解
std::launder å¨å
¶åæ°ä¸æ ææãå¿
é¡»ç¨å
¶è¿åå¼è®¿é®å¯¹è±¡ãä»èï¼èå¼è¿åå¼å§ç»æ¯é误ã
std::launder çå
¸åç¨éå
æ¬ï¼
- è·å¾æåå¨åç±»åæ¢å对象çåå¨ä¸å建ç对象çæéï¼è¿éä¸è½éç¨æåæ§å¯¹è±¡çæéï¼ä¾å¦ï¼å 为任ä¸å¯¹è±¡ä¸ºåºç±»å对象ï¼ï¼
- è·å¾æå对象çæéï¼è¯¥å¯¹è±¡ç±å¸ç½®
new仿å为该对象æä¾åå¨ç对象çæéå建ã
å¯è§¦åæ§éå¶ç¡®ä¿ä¸è½ç¨ std::launder 访é®ä¸å¯éè¿åæé访é®çåèï¼ä»èå¹²æ¶ç¼è¯å¨çéé¸åæã
int x[10]; auto p = std::launder(reinterpret_cast<int(*)[10]>(&x[0])); // OK  int x2[2][10]; auto p2 = std::launder(reinterpret_cast<int(*)[10]>(&x2[0][0])); // æªå®ä¹è¡ä¸ºï¼å¯éè¿äº§ççæå x2[0] çæé触å x2[1] ï¼ä½ä¸å¯ä»æºè§¦å  struct X { int a[10]; } x3, x4[2]; // æ åå¸å±ï¼å宿 å¡«å auto p3 = std::launder(reinterpret_cast<int(*)[10]>(&x3.a[0])); // OK auto p4 = std::launder(reinterpret_cast<int(*)[10]>(&x4[0].a[0])); // æªå®ä¹è¡ä¸ºï¼å¯éè¿äº§ççæå x4[0].a çæéï¼å®ä¸ x4[0] æéé´å¯è½¬æ¢ï¼è§¦å x4[1] ï¼ä½ä¸å¯ä»æºè§¦å  struct Y { int a[10]; double y; } x5; auto p5 = std::launder(reinterpret_cast<int(*)[10]>(&x5.a[0])); // æªå®ä¹è¡ä¸ºï¼å¯éè¿äº§ççæå x5.a çæé触å x5.y ï¼ä½ä¸å¯ä»æºè§¦å
示ä¾
#include <new> #include <cstddef> #include <cassert>  struct X { const int n; // 注æï¼ X æ¥æ const æå int m; };  struct Y { int z; };  struct A { virtual int transmogrify(); };  struct B : A { int transmogrify() override { new(this) A; return 2; } };  int A::transmogrify() { new(this) B; return 1; }  static_assert(sizeof(B) == sizeof(A));  int main() { X *p = new X{3, 4}; const int a = p->n; X* np = new (p) X{5, 6}; // p ä¸æåæ°å¯¹è±¡ï¼å 为 X::n 为 const ï¼è np æåæ°å¯¹è±¡ const int b = p->n; // æªå®ä¹è¡ä¸º const int c = p->m; // æªå®ä¹è¡ä¸ºï¼å³ä½¿ m 为é const ï¼ä¹ä¸è½ç¨ p ï¼ const int d = std::launder(p)->n; // OK ï¼ std::launder(p) æåæ°å¯¹è±¡ const int e = np->n; // OK  alignas(Y) std::byte s[sizeof(Y)]; Y* q = new(&s) Y{2}; const int f = reinterpret_cast<Y*>(&s)->z; // ç±»æå访é®ä¸ºæªå®ä¹è¡ä¸ºï¼ // reinterpret_cast<Y*>(&s) æ¥æå¼âæå s çæéâ // èéæå Y 对象 const int g = q->z; // OK const int h = std::launder(reinterpret_cast<Y*>(&s))->z; // OK  A i; int n = i.transmogrify(); // int m = i.transmogrify(); // æªå®ä¹è¡ä¸º int m = std::launder(&i)->transmogrify(); // OK assert(m + n == 3); }
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| LWG 2859 | C++17 | å¯è§¦åçå®ä¹æªèèæ¥èªæéå¯äºè½¬æ¢ç对象çæéç®æ¯ | å·²èè |