diff --git a/args.hxx b/args.hxx index 1700db1..4bcbd67 100644 --- a/args.hxx +++ b/args.hxx @@ -4248,7 +4248,7 @@ namespace args return value; } - T *operator -> () const noexcept + const T *operator -> () const noexcept { return &value; } diff --git a/test/constant_flag.cxx b/test/constant_flag.cxx index 76ea056..a4d9f45 100644 --- a/test/constant_flag.cxx +++ b/test/constant_flag.cxx @@ -15,6 +15,11 @@ enum class LogLevel { using LogFlag = args::ConstantFlag; +struct Version { + int high; + int low; +}; + int main() { args::ArgumentParser parser("This is a test program.", "This goes after the options."); @@ -54,5 +59,19 @@ int main() test::require(longWarningMatches[0]->Get() == LogLevel::WARNING); test::require(**(longWarningMatches[0]) == LogLevel::WARNING); + // Reach into a class-typed constant through operator->. This instantiates + // ConstantFlag::operator->, which the checks above never do because they + // use a ConstantFlag pointer (plain pointer arrow) rather than the flag + // object itself. + args::ArgumentParser versionParser("This is a test program."); + args::ConstantFlag stable(versionParser, "stable", "stable version", {'s', "stable"}, Version{2, 5}); + versionParser.ParseArgs(std::vector{"--stable"}); + test::require(stable->high == 2); + test::require(stable->low == 5); + test::require((*stable).high == 2); + + const args::ConstantFlag &constStable = stable; + test::require(constStable->low == 5); + return 0; }