Ошибка аргумента по умолчанию: обработка строки как bool

У меня есть класс только для заголовка с двумя функциями

  //F1
  void add_argument(const std::string &name, const std::string &desc,
                    const bool required = false) {
    //...
  }

и

  //F2
  void add_argument(const std::string &name, const std::string &long_name,
                    const std::string &desc, const bool required = false) {
    //...
  }

и в моем коде я звоню

//L1: should call F2
add_argument("-w", "--write",
             "Writes the calibrated values to the config.",
             false);

//L2: should also call F2
add_argument(
  "-i", "--interval",
  "The time interval in milliseconds that it should check in.");

Предполагается, что и L1, и L2 вызывают один и тот же метод F2. Однако, когда я компилирую и запускаю, L1 правильно вызывает F2, но L2 вызывает F1.

Мне интересно, почему кажется, что в L2 последняя строка преобразуется в логическое значение, а не используется аргумент по умолчанию? Является ли это частью стандарта С++ 11, это ошибка компилятора/компоновщика, или я делаю глупую ошибку?

Это компилируется и запускается на RaspberryPi

  Linux raspberrypi 4.14.71-v7+ Raspbian GNU/Linux 9 (stretch)
  g++ (Raspbian 6.3.0-18+rpi1+deb9u1) 6.3.0 20170516
  GNU ld (GNU Binutils for Raspbian) 2.28

используя команду, подобную этой (на самом деле я использую cmake с make для команд, которые трудно скопировать точно)

  g++ -std=c++11 -Wall -I. main.cpp -o test

(я не получаю предупреждений компилятора)


person Jesse Laning    schedule 10.12.2018    source источник
comment
Строковые литералы являются указателями, и правила языка говорят, что преобразование указателя в логическое значение предпочтительнее, чем преобразование, определяемое пользователем (например, const char[] в std::string). См. здесь для подробного объяснения   -  person alter igel    schedule 10.12.2018
comment
Вы можете попробовать явно построить std::string, например, передав std::string("The time interval in milliseconds that it should check in."). Но я не уверен, что есть более простое решение, которое предотвращает возникновение этой ловушки в первую очередь.   -  person alter igel    schedule 10.12.2018
comment
В С++ 17 можно использовать строковые литералы: "string"s. См.: en.cppreference.com/w/cpp/string/ основная_строка/оператор%22%22s   -  person Evg    schedule 10.12.2018
comment
Спасибо за помощь, дубликаты ответов решили это.   -  person Jesse Laning    schedule 10.12.2018