Я пытаюсь обеспечить std::string
аргумент как описание варианта. В общем, аргумент, сфера жизни которого не определена. Подробно хочу предоставить перевод.
using namespace boost::program_options;
using namespace boost::locale;
options_description desc (translate ("Hello world!"));
desc.add_options ()
("help", translate ("Veni vidi vici"))
;
add_options()
возвращает экземпляр options_description_easy_init
который заранее определяет ()
оператор, так что вы можете использовать синтаксис выше. Теперь этот оператор принимает только const char*
как описание, и это меня раздражает. Поэтому я имею в виду следующие вопросы:
Какова политика собственности этого класса? Сохраняются ли эти указатели только, следовательно, источник должен жить столько же, сколько живет описание, или это безопасно (чёрт!):
("help", translate ("Veni vidi vici").str ().c_str ())
В чем причина наличия только const char_type*
как описание параметра?
Вы называете это, лично я бы предложил Boost Locale http://www.boost.org/doc/libs/1_61_0/libs/locale/doc/html/messages_formatting.html но, возможно, вы уже делаете
если ничего не задокументировано, вы можете предположить, что строка скопирована. Все остальное будет (документация) ошибка
Нетрудно проверить код для
option_description
и увидеть, что это действительно такstd::string m_short_name, m_long_name, m_description; // shared_ptr is needed to simplify memory management in // copy ctor and destructor. shared_ptr<const value_semantic> m_value_semantic;
Это делает очевидным, что компиляторы разрешают любую строку / литерал в стиле C, в то же время документируя для пользователей, что встроенные NUL-символы НЕ возможны (подразумевая, что вы не можете использовать UCS2 или подобное). Кроме этого, я согласен, что было бы более чисто объявить формальный параметр как std::string
,
Вы можете предоставить запрос на включение в библиотеку с обоснованием
Сопровождающий (ы)
Других решений пока нет …