Boost.Program_Options:为什么 options_description_easy_init::operator() 没有 std::string 的重载?

Boost.Program_Options: Why does options_description_easy_init::operator() not have an overload for std::string?

考虑这个 MCVE:

#include <boost/program_options.hpp>
#include <iostream>
#include <map>

namespace po = boost::program_options;
using namespace std;

po::options_description createOptions(const std::string& description, const map<string, string>& opts) {
    po::options_description newoptions(description);

    for (const auto& [k, v] : opts) {
        newoptions.add_options()(k, v);
    }
    return newoptions;
}

int main() {

    map<string, string> descMap = {
        { "key", "description" },
        { "hello", "world" }
    };

    auto opts = createOptions("My options", descMap);

    cout << opts << endl;
}

我正在尝试编写一个方便的函数来减少将类似选项插入 options_description 对象时的 C&P 代码量(原始代码使用通知程序,为简单起见已将其删除,但添加了更多样板文件) . 令我惊讶的是,there is no options_description_easy_init::operator() overload that accepts std::string, thus the example fails to compile.

虽然我可以通过在 for 循环中对 kv 调用 .c_str() 来轻松地使示例工作,当然 this would be dangerous。 boost 开发者遗漏如此重要的过载有什么原因吗?他们为什么不首先使用 const std::string& 作为参数?

没有 .c_str() 我怎样才能使这段代码工作?没有迹象表明指针内存将在内部复制(无论如何这都很奇怪)而且我真的不想回到过去并自己管理内存:-)

调查 implementation, it seems that internally the const char* argument passed to options_description_easy_init::operator() is wrapped by a new option_description object, which eventually converts the argument into a std::string。因此,正如@pptaszni 评论的那样,std::string 参数上调用.c_str() 以将它们传递给程序选项是 安全的。

然而,我仍然不明白的是为什么没有 std::string 重载。我认为这是一个设计缺陷(同时考虑到 options_description 有一个 constructor taking std::string)。