I am experimenting with the new annotation freshly added in C++26, specifically looking at the examples provided in the proposal paper.
The paper contains the following example using a hypothetical clap library for argument parsing:
struct Args {
[[=clap::Help("Name of the person to greet")]]
[[=clap::Short, =clap::Long]]
std::string name;
[[=clap::Help("Number of times to greet")]]
[[=clap::Short, =clap::Long]]
int count = 1;
};
int main(int argc, char** argv) {
Args args = clap::parse(argc, argv);
for (int i = 0; i < args.count; ++i) {
std::cout << "Hello " << args.name << '\n';
}
}
Behind the scenes, the struct definition for the Help annotation looks something like this:
struct HelpArg {
const char* msg;
};
However, the Godbolt link provided in the paper (https://godbolt.org/z/dM3erErrz) currently fails to compile in Clang. It emits the following error:
error: pointer to subobject of string literal is not allowed in a template argument
This will also fail in the upcoming GCC 16 because C++26 annotation values require the type to be a "structural type", and holding a pointer to a string literal violates the NTTP (Non-Type Template Parameter) rules, afaik.
What is the standard workaround to make string literal annotations work in supporting C++26 compilers?