最終更新日時(UTC):
が更新

履歴 編集

function
<source_location>

std::source_location::current(C++20)

static consteval source_location current() noexcept;

概要

この関数を呼び出したソースコード上の位置を表すsource_locationオブジェクトを返す。

効果

current()という式で呼び出された場合は、処理系定義の値を持つsource_locationオブジェクトを返す。

このとき、次のことが期待できる。

  • __LINE____FILE__と同じように#lineの影響を受ける。
  • line()の値は__LINE__が表すような行番号であり、1オリジンだが、行番号が不明のときは0になる可能性がある。
  • column()の値は行頭からのオフセットを表す処理系定義の値で、1オリジンだが、列番号が不明のときは0になる可能性がある。
  • file_name()の値は__FILE__が表すような現在のファイル名である。
  • function_name()の値は__func__が表すような現在の関数名であり、__func__が定義されないような状況では空文字列である。

その他の方法で呼び出されたときは、未規定の有効な値を返す。

戻り値

この関数を呼び出した側のソースコード上の位置を表すsource_locationオブジェクト。

事後条件

file_name()function_name()の値は有効なヌル終端バイト文字列(NTBS)である。

例外

投げない。

備考

  • 波カッコまたは=による非静的データメンバ初期化の中でcurrent()を使う場合、current()の値は初期値が宣言された場所ではなく、その初期化をするに至ったコンストラクタや集成体を指す。
  • 引数のデフォルト値にcurrent()を使う場合、current()の値はデフォルト値が宣言された場所ではなく、その関数の呼び出し側を表す。

struct Type {
  source_location loc_ = source_location::current(); // (1)

  Type(source_location loc = source_location::current()) // (2)
    : loc_(loc)
  {
  }

  Type(int) // (3)
  {
  }
};

  • (1): 非静的データメンバの初期化にcurrent()を使う
  • (2): 引数locはデフォルトで呼び出し側の位置を表す。loc_の値はコンストラクタを呼び出した側の位置になる
  • (3): このコンストラクタにはloc_の初期化子がないので、(1)で初期化され、loc_の値は(3)のコンストラクタの位置になる

void func(source_location a = source_location::current()) {
  source_location b = source_location::current(); // (1)
}

int main() {
  f(); // (2)

  source_location c = source_location::current();
  f(c); // (3)
}

  • (1): ローカル変数; bの値は(1)の行を表す
  • (2): デフォルト引数を渡す; funcの引数aの値は(2)の行を指す
  • (3): 明示的に引数を渡す; funcの引数aの値はcと同じ

#include <iostream>
#include <source_location>

int main()
{
  const std::source_location location = std::source_location::current();
  std::cout << location.line() << std::endl;
  std::cout << location.column() << std::endl;
  std::cout << location.file_name() << std::endl;
  std::cout << location.function_name() << std::endl;
}

出力例

??
??
??
??

バージョン

言語

  • C++20

処理系

参照