Movatterモバイル変換


[0]ホーム

URL:



This page is a snapshot from the LWG issues list, see theLibrary Active Issues List for more information and the meaning ofC++23 status.

3495.constexpr launder makes pointers to inactive members of unions usable

Section: 17.6.5[ptr.launder]Status:C++23Submitter: Hubert TongOpened: 2020-11-10Last modified: 2023-11-22

Priority:3

View all otherissues in [ptr.launder].

View all issues withC++23 status.

Discussion:

The wording in 17.6.5[ptr.launder] paragraph 4:

An invocation of this function may be used in a core constant expression whenever the value of its argument may be used in a core constant expression.

can be taken to mean that the invocation may be used only when the value of its argument can be used in place of the invocation itself.

That interpretation is not particularly obvious, but based on comments on the CWG reflector (seehere), that is the interpretation that matches the design intent.

Consider:

#include <new>struct A { int x; int y; };struct B { float x; int y; };union U {  A a;  B b;};constexpr A foo() {  U u;  int* byp = &u.b.y;  static_assert(&u.b.y == static_cast<void*>(&u.a.y));  u.a.y = 42;  *std::launder(byp) = 13;  return u.a;}extern constexpr A globA = foo();

If thestatic_assert succeeds, then a possible interpretation is that the source file above compiles because the call tostd::launder produces a pointer tou.a.y.That interpretation is apparently not desirable.

[2020-11-21; Reflector prioritization]

Set priority to 3 during reflector discussions.

[2020-12-07; Davis Herring comments]

This issue is related toCWG 2464.

[2021-02-08; Reflector poll]

Set status to Tentatively Ready after five votes in favour during reflector poll.

[2021-02-26 Approved at February 2021 virtual plenary. Status changed: Tentatively Ready → WP.]

Proposed resolution:

This wording is relative toN4868.

  1. Modify 17.6.5[ptr.launder] as indicated:

    template<class T> [[nodiscard]] constexpr T* launder(T* p) noexcept;

    […]

    -4-Remarks: An invocation of this function may be used in a core constant expressionwhenever theif and only if the (converted) value of its argument may be used ina core constant expressionplace of the function invocation. A byte of storageb is reachable through a pointer value that points to an objectY if there is an objectZ, pointer-interconvertible withY, such thatb is within the storage occupied byZ, or the immediately-enclosing array object ifZ is an array element.

    […]


[8]ページ先頭

©2009-2026 Movatter.jp