std::source_location::source_location
From cppreference.com
 
 
 < cpp | utility | source location 
 
 
 C++ 
 Feature test macros (C++20)
 Concepts library (C++20)
 Metaprogramming library (C++11)
 Ranges library (C++20)
 Filesystem library (C++17)
 Concurrency support library (C++11)
 Execution control library (C++26)
Utilities library 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
  
 
 
 Type support (basic types, RTTI)
 Library feature-test macros (C++20)
(C++11)
(C++20)
(C++26)
(C++20)
 Coroutine support (C++20)
 Contract support (C++26)
(C++20)(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
  (C++20)(C++20)(C++20)
  (C++20)(C++20)(C++20)
 General utilities
 Relational operators (deprecated in C++20)
(C++20)(C++20)(C++20)
  (C++20)(C++20)(C++20)
(C++20)
 Swap and type operations 
 Common vocabulary types
std::source_location 
 
 Member functions
 Creation
source_location::source_location
 Field access
constexpr source_location() noexcept;
 (1) 
 (since C++20) 
source_location( const source_location& other );
 (2) 
 (since C++20) 
source_location( source_location&& other ) noexcept;
 (3) 
 (since C++20) 
1) Constructs a 
source_location object of unspecified value.2,3) Copy and move constructors. It is unspecified whether they are trivial and/or constexpr.
[edit] Parameters
 other
 -
 another 
source_location to copy or move from
[edit] Example
Run this code
#include <iomanip> #include <iostream> #include <ranges> #include <source_location> #include <string_view> #include <vector> // GCC specific type name printer #if (__GNUG__ >= 11) template<typename T> auto type_name_helper(const std::source_location s = std::source_location::current()) { using std::operator""sv; const std::string_view fun_name{s.function_name()}; constexpr auto prefix{"[with T = "sv}; const auto type_name_begin{fun_name.find(prefix)}; if (""sv.npos == type_name_begin) return ""sv; const std::size_t first{type_name_begin + prefix.length()}; return std::string_view {fun_name.cbegin() + first, fun_name.cend() - 1}; } template<typename T> auto type_name() { return type_name_helper<T>(); } #endif void print(std::string_view const comment, std::source_location const l) { std::cout << comment << ":\n" << " file_name : " << std::quoted (l.file_name()) << '\n' << " function_name : " << std::quoted (l.function_name()) << '\n' << " line : " << l.line() << '\n' << " column : " << l.column() << '\n'; } int main() { constexpr std::source_location default_constructed; print("default constructed", default_constructed); constexpr std::source_location current = std::source_location::current(); print("current", current); #if (__GNUG__ >= 11) const std::vector <std::vector <int>> v{{1,2}, {3,4,5}, {6}}; auto jv = std::ranges::join_view (v); std::cout << '\n' << '[' << type_name<int>() << "]\n" << '[' << type_name<double*>() << "]\n" << '[' << type_name<decltype([](){})>() << "]\n" << '[' << type_name<decltype(type_name<int>())>() << "]\n" << '[' << type_name<decltype(jv)>() << "]\n"; #endif }
Possible output:
default constructed: file_name : "" function_name : "" line : 0 column : 0 current: file_name : "main.cpp" function_name : "int main()" line : 39 column : 75 [int] [double*] [main()::<lambda()>] [std::basic_string_view<char>] [std::ranges::join_view<std::ranges::ref_view<const std::vector<std::vector<int> > > >]
[edit] See also
[static]
source_location corresponding to the location of the call site (public static member function) [edit]