std::source_location::current
static consteval source_location current() noexcept; | (начиная с C++20) |
Создаёт новый объект source_location, соответствующий месту вызова.
Возвращаемое значение
Если current() вызывается напрямую (посредством вызова функции, в котором указано имя current()), она возвращает объект source_location со значениями, определяемыми реализацией и представляющими место вызова. На значения должна влиять директива препроцессора #line так же, как и на предопределённые макросы __LINE__ и __FILE__.
Если current() используется в инициализаторе члена класса по умолчанию, возвращаемое значение соответствует месту определения конструктора или агрегатной инициализации, инициализирующего этот член данных.
Если current() используется в аргументе по умолчанию, возвращаемое значение соответствует месту вызова current().
Если current() вызывается любым другим способом, возвращаемое значение не определено.
Примечания
Для std::source_location::current обычно требуется встроенная реализация компилятора.
Пример
#include <print>
#include <source_location>
struct src_rec
{
std::source_location srcl = std::source_location::current();
int dummy{};
src_rec(std::source_location loc = std::source_location::current()) :
srcl(loc) // values of member refer to the location of the calling function
{}
src_rec(int i) : // values of member refer to this location
dummy(i)
{}
src_rec(double) // values of member refer to this location
{}
};
std::source_location src_clone(std::source_location a = std::source_location::current())
{
return a;
}
std::source_location src_make()
{
return std::source_location::current();
}
int main()
{
const auto r0 = src_rec();
const auto r1 = src_rec(0);
const auto r2 = src_rec(0.0);
const auto s0 = std::source_location::current();
const auto s1 = src_clone(s0);
const auto s2 = src_clone();
const auto s3 = src_make();
std::println("#{1} {0} {2}", "r0", r0.srcl.line(), r0.srcl.function_name());
std::println("#{1} {0} {2}", "r1", r1.srcl.line(), r1.srcl.function_name());
std::println("#{1} {0} {2}", "r2", r2.srcl.line(), r2.srcl.function_name());
std::println("#{1} {0} {2}", "s0", s0.line(), s0.function_name());
std::println("#{1} {0} {2}", "s1", s1.line(), s1.function_name());
std::println("#{1} {0} {2}", "s2", s2.line(), s2.function_name());
std::println("#{1} {0} {2}", "s3", s3.line(), s3.function_name());
}
Возможный вывод:
#31 r0 int main() #13 r1 src_rec::src_rec(int) #16 r2 src_rec::src_rec(double) #34 s0 int main() #34 s1 int main() #36 s2 int main() #26 s3 std::source_location src_make()
См. также
создаёт объект source_location со значениями, определяемыми реализацией (открытая функция-член) |
|
|
[статическая] | получает текущую трассировку стека или её заданную часть (открытая статическая функция-член std::basic_stacktrace<Allocator>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/source_location/current