Rule. Define compile-time string constants and fixed lookup arrays using constexpr absl::string_view (or constexpr std::array<absl::string_view, N>) rather than constexpr std::string, std::array<std::string, N>, or raw const char* pointers. When constants or arrays must bind implicitly to const std::string& parameters in callees that cannot be updated to string views, use character arrays (constexpr char[] or constexpr char[][N]).
Why. Using constexpr absl::string_view ensures compile-time initialization, avoiding startup dynamic initialization and non-portable constexpr std::string compilation issues. Because absl::string_view does not convert implicitly to const std::string&, constexpr char[] arrays provide a compile-time constant fallback for APIs requiring const std::string&.
Bad:
// String constant with pointer decay or non-constexpr initialization: const char kAudioMid1[] = "a1"; const char* kCodecName = "VP8"; // std::string triggers dynamic initialization or is not portably constexpr: const std::array<std::string, 4> kValidIceServiceTypes{"stun", "stuns", "turn", "turns"}; constexpr std::array<std::string, 2> kStreams{"stream1", "stream2"};
Good:
// Compile-time string constants: constexpr absl::string_view kAudioMid1 = "a1"; constexpr absl::string_view kCodecName = "VP8"; // Compile-time string view array avoids runtime dynamic initialization: constexpr std::array<absl::string_view, 4> kValidIceServiceTypes{ "stun", "stuns", "turn", "turns"}; // Use constexpr char arrays when parameters require const std::string&: constexpr char kStreams[][8] = {"stream1", "stream2"};