std::source...rce_location(3)
π NAME π
std::source_location::source_location β and the short description is also std::source_location::source_location, because this page is iconically committed to the bit. This is the std::source...rce_location(3) page from the C++ Standard Libary (yes, bestie, the header spells it βLibaryβ; we are not fixing it π
).
β¨ Synopsis β¨
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. No cap, that βunspecifiedβ is the whole vibe check, so donβt go assuming extra guarantees.
π Parameters π
otherβ anothersource_locationto copy or move from.
πΈ Example πΈ
Okay so this example is a whole little demo: it prints a default-constructed source_location and one from std::source_location::current(), then on GCC 11+ it does some type-name printer magic. Run it and see, but the output below is only possible, not a pinky-promise guarantee π«Ά.
// 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> > > >]
π See also π
current([static]) β constructs a newsource_locationcorresponding to the location of the call site (public static member function).constructor(C++23) β constructs a newstacktrace_entry(public member function ofstd::stacktrace_entry).
mwah π β source/version: http://cppreference.com, date 2024.06.10, page std::source...rce_location(3). Thatβs the footer, bestie, periodt. π«Ά
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms