Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::is_constant_evaluated(3) C++ Standard Libarystd::is_constant_evaluated(3)

NAME
       std::is_constant_evaluated - std::is_constant_evaluated

Synopsis
	  Defined in header <type_traits>
	  constexpr bool is_constant_evaluated() noexcept;  (since C++20)

	  Detects whether the function call occurs within a constant-evaluated
       context.
	  Returns true if the evaluation of the	call occurs within the evalua-
       tion of an
	  expression or	conversion that	is manifestly constant-evaluated; oth-
       erwise returns
	  false.

	  While	 testing  whether initializers of following variables are con-
       stant initializers,
	  compilers may	first perform a	trial constant evaluation of the  ini-
       tializers:

	    *  variables  with	reference  type	or const-qualified integral or
       enumeration type

		 * if the initializers are constant expressions, the variables
       are usable in
		   constant expressions

	    * static and thread	local variables

		 * if when all subexpressions of the  initializers  (including
       constructor calls
		   and	implicit conversions) are constant expressions,	static
       initialization
		   is performed, which can be asserted by constinit

	  It is	not recommended	to depend on the result	in this	case.

	int y;
	const int a = std::is_constant_evaluated() ? y : 1;
	// Trial constant evaluation fails. The	constant  evaluation  is  dis-
       carded.
	// Variable a is dynamically initialized with 1

	const int b = std::is_constant_evaluated() ? 2 : y;
	// Constant evaluation with std::is_constant_evaluation() == true suc-
       ceeds.
	// Variable b is statically initialized	with 2

Parameters
	  (none)

Return value
	  true	if  the	evaluation of the call occurs within the evaluation of
       an expression or
	  conversion that is manifestly	constant-evaluated; otherwise false.

Possible implementation
	  // This implementation requires C++23	if consteval.
	  constexpr bool is_constant_evaluated() noexcept
	  {
	      if consteval {
		  return true;
	      }
	      else {
		  return false;
	      }
	  }

Notes
	  When directly	used as	the condition of static_assert declaration  or
       constexpr if
	  statement, std::is_constant_evaluated() always returns true.

	  Because  if consteval	is absent in C++20, std::is_constant_evaluated
       is typically
	  implemented by a compiler extension.

	  Feature-test macro: __cpp_lib_is_constant_evaluated

Example
       // Run this code

	#include <type_traits>
	#include <cmath>
	#include <iostream>

	constexpr double power(double b, int x)
	{
	    if (std::is_constant_evaluated() &&	!(b == 0.0 && x	< 0)) {
		// A constant-evaluation context: Use a	constexpr-friendly al-
       gorithm.
		if (x == 0)
		    return 1.0;
		double r = 1.0,	p = x >	0 ? b :	1.0 / b;
		auto u = unsigned(x > 0	? x : -x);
		while (u != 0) {
		    if (u & 1) r *= p;
		    u /= 2;
		    p *= p;
		}
		return r;
	    } else {
		// Let the code	generator figure it out.
		return std::pow(b, double(x));
	    }
	}

	int main()
	{
	    // A constant-expression context
	    constexpr double kilo = power(10.0,	3);
	    int	n = 3;
	    // Not a constant expression, because n cannot be converted	to  an
       rvalue
	    // in a constant-expression	context
	    // Equivalent to std::pow(10.0, double(n))
	    double mucho = power(10.0, n);

	    std::cout << kilo << " " <<	mucho << "\n"; // (3)
	}

Output:
	1000 1000

See also
	  constexpr specifier(C++11) specifies that the	value of a variable or
       function	can be
				     computed at compile time
				     specifies that a function is an immediate
       function, that
	  consteval specifier(C++20) is, every call to the function must be in
       a constant
				     evaluation
	  constinit  specifier(C++20)  asserts that a variable has static ini-
       tialization, i.e.
				     zero initialization and constant initial-
       ization

http://cppreference.com		  2022.07.31	 std::is_constant_evaluated(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::is_constant_evaluated&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help