[support.srcloc] # 17 Language support library [[support]](./#support) ## 17.8 Source location [support.srcloc] ### [17.8.1](#source.location.syn) Header synopsis [[source.location.syn]](source.location.syn) [1](#source.location.syn-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3619) The header defines the class source_location that provides a means to obtain source location information[.](#source.location.syn-1.sentence-1) // all freestandingnamespace std {struct source_location;} ### [17.8.2](#class) Class source_location [[support.srcloc.class]](support.srcloc.class) #### [17.8.2.1](#class.general) General [[support.srcloc.class.general]](support.srcloc.class.general) [🔗](#lib:source_location) namespace std {struct source_location {// source location constructionstatic consteval source_location current() noexcept; constexpr source_location() noexcept; // source location field accessconstexpr 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*};} [1](#class.general-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3658) The type source_location meets the[*Cpp17DefaultConstructible*](utility.arg.requirements#:Cpp17DefaultConstructible "16.4.4.2 Template argument requirements [utility.arg.requirements]"),[*Cpp17CopyConstructible*](utility.arg.requirements#:Cpp17CopyConstructible "16.4.4.2 Template argument requirements [utility.arg.requirements]"),[*Cpp17CopyAssignable*](utility.arg.requirements#:Cpp17CopyAssignable "16.4.4.2 Template argument requirements [utility.arg.requirements]"),[*Cpp17Swappable*](swappable.requirements#:Cpp17Swappable "16.4.4.3 Swappable requirements [swappable.requirements]"), and[*Cpp17Destructible*](utility.arg.requirements#:Cpp17Destructible "16.4.4.2 Template argument requirements [utility.arg.requirements]") requirements ([[utility.arg.requirements]](utility.arg.requirements "16.4.4.2 Template argument requirements"), [[swappable.requirements]](swappable.requirements "16.4.4.3 Swappable requirements"))[.](#class.general-1.sentence-1) All of the following conditions are true: - [(1.1)](#class.general-1.1) is_nothrow_move_constructible_v - [(1.2)](#class.general-1.2) is_nothrow_move_assignable_v - [(1.3)](#class.general-1.3) is_nothrow_swappable_v [*Note [1](#class.general-note-1)*: The intent of source_location is to have a small size and efficient copying[.](#class.general-1.sentence-2) It is unspecified whether the copy/move constructors and the copy/move assignment operators are trivial and/or constexpr[.](#class.general-1.sentence-3) — *end note*] [2](#class.general-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3680) The data members file_name_ and function_name_ always each refer to an ntbs[.](#class.general-2.sentence-1) [3](#class.general-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3684) The copy/move constructors and the copy/move assignment operators ofsource_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: - [(3.1)](#class.general-3.1) strcmp(lhs.file_name(), rhs_p.file_name()) == 0 - [(3.2)](#class.general-3.2) strcmp(lhs.function_name(), rhs_p.function_name()) == 0 - [(3.3)](#class.general-3.3) lhs.line() == rhs_p.line() - [(3.4)](#class.general-3.4) lhs.column() == rhs_p.column() #### [17.8.2.2](#cons) Creation [[support.srcloc.cons]](support.srcloc.cons) [🔗](#cons-itemdecl:1) `static consteval source_location current() noexcept; ` [1](#cons-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3705) *Returns*: - [(1.1)](#cons-1.1) When invoked by a function call whose [*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1 General [expr.post.general]") is a (possibly parenthesized) [*id-expression*](expr.prim.id.general#nt:id-expression "7.5.5.1 General [expr.prim.id.general]") naming current, returns a source_location with an implementation-defined value[.](#cons-1.1.sentence-1) The value should be affected by #line ([[cpp.line]](cpp.line "15.8 Line control")) in the same manner as for __LINE__ and __FILE__[.](#cons-1.1.sentence-2) The values of the exposition-only data members of the returned source_location object are indicated in Table [43](#tab:support.srcloc.current "Table 43: Value of object returned by current")[.](#cons-1.1.sentence-3) Table [43](#tab:support.srcloc.current) — Value of object returned by current [[tab:support.srcloc.current]](./tab:support.srcloc.current) | [🔗](#tab:support.srcloc.current-row-1)
**Element** | **Value** | | --- | --- | | [🔗](#tab:support.srcloc.current-row-2)
line_ | A presumed line number ([[cpp.predefined]](cpp.predefined "15.12 Predefined macro names"))[.](#tab:support.srcloc.current-row-2-column-2-sentence-1)
Line numbers are presumed to be 1-indexed; however, an implementation is encouraged to use 0 when the line number is unknown[.](#tab:support.srcloc.current-row-2-column-2-sentence-2) | | [🔗](#tab:support.srcloc.current-row-3)
column_ | An implementation-defined value denoting some offset from the start of the line denoted by line_[.](#tab:support.srcloc.current-row-3-column-2-sentence-1)
Column numbers are presumed to be 1-indexed; however, an implementation is encouraged to use 0 when the column number is unknown[.](#tab:support.srcloc.current-row-3-column-2-sentence-2) | | [🔗](#tab:support.srcloc.current-row-4)
file_name_ | A presumed name of the current source file ([[cpp.predefined]](cpp.predefined "15.12 Predefined macro names")) as an ntbs[.](#tab:support.srcloc.current-row-4-column-2-sentence-1) | | [🔗](#tab:support.srcloc.current-row-5)
function_name_ | A name of the current function such as in __func__ ([[dcl.fct.def.general]](dcl.fct.def.general "9.6.1 General")) if any, an empty string otherwise[.](#tab:support.srcloc.current-row-5-column-2-sentence-1) | - [(1.2)](#cons-1.2) Otherwise, when invoked in some other way, returns a source_location whose data members are initialized with valid but unspecified values[.](#cons-1.2.sentence-1) [2](#cons-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3748) *Remarks*: Any call to current that appears as a default member initializer ([[class.mem.general]](class.mem.general "11.4.1 General")), or as a subexpression thereof, should correspond to the location of the constructor definition or aggregate initialization that uses the default member initializer[.](#cons-2.sentence-1) Any call to current that appears as a default argument ([[dcl.fct.default]](dcl.fct.default "9.3.4.7 Default arguments")), or as a subexpression thereof, should correspond to the location of the invocation of the function that uses the default argument ([[expr.call]](expr.call "7.6.1.3 Function call"))[.](#cons-2.sentence-2) [3](#cons-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3763) [*Example [1](#cons-example-1)*: 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]](dcl.fct.default "9.3.4.7 Default arguments")){} 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*] [🔗](#cons-itemdecl:2) `constexpr source_location() noexcept; ` [4](#cons-4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3796) *Effects*: The data members are initialized with valid but unspecified values[.](#cons-4.sentence-1) #### [17.8.2.3](#obs) Observers [[support.srcloc.obs]](support.srcloc.obs) [🔗](#obs-itemdecl:1) `constexpr uint_least32_t line() const noexcept; ` [1](#obs-1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3807) *Returns*: line_[.](#obs-1.sentence-1) [🔗](#obs-itemdecl:2) `constexpr uint_least32_t column() const noexcept; ` [2](#obs-2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3816) *Returns*: column_[.](#obs-2.sentence-1) [🔗](#obs-itemdecl:3) `constexpr const char* file_name() const noexcept; ` [3](#obs-3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3825) *Returns*: file_name_[.](#obs-3.sentence-1) [🔗](#obs-itemdecl:4) `constexpr const char* function_name() const noexcept; ` [4](#obs-4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L3834) *Returns*: function_name_[.](#obs-4.sentence-1)