17 Language support library [support]

17.8 Source location [support.srcloc]

17.8.2 Class source_­location [support.srcloc.class]

namespace std {
  struct source_location {
    // source location construction
    static consteval source_location current() noexcept;
    constexpr source_location() noexcept;

    // source location field access
    constexpr uint_least32_t line() const noexcept;
    constexpr uint_least32_t column() const noexcept;
    constexpr const char* file_name() const noexcept;
    constexpr const char* function_name() const noexcept;

  private:
    uint_least32_t line_;               // exposition only
    uint_least32_t column_;             // exposition only
    const char* file_name_;             // exposition only
    const char* function_name_;         // exposition only
  };
}
The type source_­location meets the Cpp17DefaultConstructible, Cpp17CopyConstructible, Cpp17CopyAssignable, and Cpp17Destructible requirements ([utility.arg.requirements]).
Lvalues of type source_­location are swappable ([swappable.requirements]).
All of the following conditions are true:
  • is_­nothrow_­move_­constructible_­v<source_­location>
  • is_­nothrow_­move_­assignable_­v<source_­location>
  • is_­nothrow_­swappable_­v<source_­location>
Note
: The intent of source_­location is to have a small size and efficient copying. It is unspecified whether the copy/move constructors and the copy/move assignment operators are trivial and/or constexpr. — end note
 ]
The data members file_­name_­ and function_­name_­ always each refer to an ntbs.
The copy/move constructors and the copy/move assignment operators of source_­location meet the following postconditions: Given two objects lhs and rhs of type source_­location, where lhs is a copy/move result of rhs, and where rhs_­p is a value denoting the state of rhs before the corresponding copy/move operation, then each of the following conditions is true:
  • strcmp(lhs.file_­name(), rhs_­p.file_­name()) == 0
  • strcmp(lhs.function_­name(), rhs_­p.function_­name()) == 0
  • lhs.line() == rhs_­p.line()
  • lhs.column() == rhs_­p.column()

17.8.2.1 Creation [support.srcloc.cons]

static consteval source_location current() noexcept;
Returns:
  • When invoked by a function call whose postfix-expression is a (possibly parenthesized) id-expression naming current, returns a source_­location with an implementation-defined value. The value should be affected by #line ([cpp.line]) in the same manner as for __LINE__ and __FILE__. The values of the exposition-only data members of the returned source_­location object are indicated in Table 38.
    Table 38: Value of object returned by current   [tab:support.srcloc.current]
    ElementValue
    line_­A presumed line number ([cpp.predefined]). Line numbers are presumed to be 1-indexed; however, an implementation is encouraged to use 0 when the line number is unknown.
    column_­An implementation-defined value denoting some offset from the start of the line denoted by line_­. Column numbers are presumed to be 1-indexed; however, an implementation is encouraged to use 0 when the column number is unknown.
    file_­name_­A presumed name of the current source file ([cpp.predefined]) as an ntbs.
    function_­name_­A name of the current function such as in __func__ ([dcl.fct.def.general]) if any, an empty string otherwise.
  • Otherwise, when invoked in some other way, returns a source_­location whose data members are initialized with valid but unspecified values.
Remarks: Any call to current that appears as a default member initializer ([class.mem]), or as a subexpression thereof, should correspond to the location of the constructor definition or aggregate initialization that uses the default member initializer.
Any call to current that appears as a default argument ([dcl.fct.default]), or as a subexpression thereof, should correspond to the location of the invocation of the function that uses the default argument ([expr.call]).
Example
:
struct s {
  source_location member = source_location::current();
  int other_member;
  s(source_location loc = source_location::current())
    : member(loc)               // values of member refer to the location of the calling function ([dcl.fct.default])
  {}
  s(int blather) :              // values of member refer to this location
    other_member(blather)
  {}
  s(double)                     // values of member refer to this location
  {}
};
void f(source_location a = source_location::current()) {
  source_location b = source_location::current();       // values in b refer to this line
}

void g() {
  f();                          // f's first argument corresponds to this line of code

  source_location c = source_location::current();
  f(c);                         // f's first argument gets the same values as c, above
}
— end example
 ]
constexpr source_location() noexcept;
Effects: The data members are initialized with valid but unspecified values.

17.8.2.2 Observers [support.srcloc.obs]

constexpr uint_least32_t line() const noexcept;
Returns: line_­.
constexpr uint_least32_t column() const noexcept;
Returns: column_­.
constexpr const char* file_name() const noexcept;
Returns: file_­name_­.
constexpr const char* function_name() const noexcept;
Returns: function_­name_­.