This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Ready status.

4591. std::meta::current_function should probably work in a local class

Section: 21.4.8 [meta.reflection.scope] Status: Ready Submitter: S. B. Tam Opened: 2026-05-31 Last modified: 2026-09-11

Priority: 2

View all issues with Ready status.

Discussion:

std::meta::current_function is specified to throw if CURRENT-SCOPE(P) does not represent a function. It is implied that current_function throws if the call is directly contained in a local class, in which case it's actually in a function body, but indirectly.

This might be an oversight, as neither P3795 (which introduced this function) nor https://wg21.link/P3795/github has any discussion concerning local classes.

Example:

#include <meta>

template<auto V> struct A { static constexpr auto value = V; };

consteval std::meta::info test() {
  struct Local { using T = A<std::meta::current_function()>; }; // valid or not?
  return Local::T::value;
}

[2026-06-16, Barry Revzin provides wording]

Previous resolution [SUPERSEDED]

This wording is relative to N5046.

  1. Modify 21.4.8 [meta.reflection.scope] as indicated:

    consteval info current_function();
    

    -6- An invocation of current_function that appears at a program point P is value-dependent (13.8.3.4 [temp.dep.constexpr]) if eval-point(P) is enclosed by a scope corresponding to a templated entity.

    -7- Let S be CURRENT-SCOPE(P), where P is the point at which the invocation of current_function lexically appears.

    -8- Returns: S if S represents a function. Otherwise, parent_of(S).

    -9- Throws: meta::exception unless S represents a function.

[2026-06-16; Ville Voutilainen provides improved wording]

[2026-08-27; Reflector poll.]

Set priority to 2 after reflector poll.

"we should say this in words, similar to current_namespace."

Previous resolution [SUPERSEDED]

This wording is relative to N5046.

  1. Modify 21.4.8 [meta.reflection.scope] as indicated:

    consteval info current_function();
    

    -6- An invocation of current_function that appears at a program point P is value-dependent (13.8.3.4 [temp.dep.constexpr]) if eval-point(P) is enclosed by a scope corresponding to a templated entity.

    -7- Let S be CURRENT-SCOPE(P), where P is the point at which the invocation of current_function lexically appears.

    -8- Returns: S if S represents a function. Otherwise, a reflection representing the nearest enclosing function of the entity represented by S.

    -9- Throws: meta::exception unless S represents a functionan enclosing function is found.

[2026-09-11; Tim provides new wording]

The invented lambdas from consteval-block-declarations need to be ignored.

[2026-09-11; LWG telecon. Status changed: New → Ready.]

Proposed resolution:

This wording is relative to N5046.

  1. Modify 21.4.8 [meta.reflection.scope] as indicated:

    consteval info current_function();
    

    -6- An invocation of current_function that appears at a program point P is value-dependent (13.8.3.4 [temp.dep.constexpr]) if eval-point(P) is enclosed by a scope corresponding to a templated entity.

    -7- Let S be CURRENT-SCOPE(P), where P is the point at which the invocation of current_function lexically appears.

    -8- Returns: S if S represents a function. Otherwise, a reflection representing the nearest enclosing function of the entity represented by S, ignoring any function call operators of closure types introduced by consteval-block-declarations (9.1 [dcl.pre]).

    -9- Throws: meta::exception unlessif S does not representrepresents a function and an enclosing function is not found.