namespace std {
consteval bool is_string_literal(const char* p); // (1) C++26
consteval bool is_string_literal(const wchar_t* p); // (2) C++26
consteval bool is_string_literal(const char8_t* p); // (3) C++26
consteval bool is_string_literal(const char16_t* p); // (4) C++26
consteval bool is_string_literal(const char32_t* p); // (5) C++26
}
概要
ポインタが文字列リテラル(またはそのサブオブジェクト)を指しているかどうかを判定する。
主にreflect_constant_string()の内部実装で使用される。reflect_constant_string()は入力が既にヌル終端された文字列リテラルであればヌル終端文字を追加せず、そうでなければ追加する必要があるため、この関数で文字列リテラルかどうかを判定する。
ユーザーが直接使用する場合は、const char*の出自をコンパイル時に検査して、文字列リテラルに由来するポインタとそうでないポインタを区別する用途が考えられる。
- (1) : 通常の文字列リテラル(
"hello")を判定する - (2) : ワイド文字列リテラル(
L"hello")を判定する - (3) : UTF-8文字列リテラル(
u8"hello")を判定する - (4) : UTF-16文字列リテラル(
u"hello")を判定する - (5) : UTF-32文字列リテラル(
U"hello")を判定する
戻り値
pが文字列リテラルまたはそのサブオブジェクトを指している場合にtrueを返す。そうでなければfalseを返す。
備考
この関数はstd名前空間に定義される(std::meta名前空間ではない)。
例
#include <meta>
#include <print>
// 文字列リテラルならそのまま使い、そうでなければコピーして使う
consteval const char* ensure_static(const char* p) {
if (std::is_string_literal(p)) {
return p; // 文字列リテラルは静的ストレージに既に存在する
}
return std::define_static_string(std::string_view(p));
}
int main() {
// 文字列リテラル
constexpr auto s1 = ensure_static("hello");
std::println("{}", s1);
// 文字列リテラルの部分文字列(サブオブジェクト)
static_assert(std::is_string_literal("hello" + 2)); // "llo"を指す
}
出力
hello
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: 16 (
-freflectionオプション指定) ✅ - Visual C++: ??