Kesalahan argumen default: memperlakukan string sebagai bool [duplikat]

Saya memiliki kelas header saja dengan dua fungsi

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

Dan

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

dan dalam kode saya, saya menelepon

//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.");

Perilaku yang dimaksudkan adalah L1 dan L2 memanggil metode F2 yang sama. Namun, ketika saya mengkompilasi dan menjalankan, L1 memanggil F2 dengan benar, tetapi L2 memanggil F1.

Yang saya ingin tahu adalah mengapa di L2 tampaknya mengubah string terakhir menjadi boolean dan tidak menggunakan argumen default? Apakah ini bagian dari standar C++11, apakah ini bug kompiler/linker, atau apakah saya membuat kesalahan bodoh?

Ini sedang dikompilasi dan dijalankan di 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

menggunakan perintah yang mirip dengan ini (saya sebenarnya menggunakan cmake dengan make sehingga perintahnya sulit untuk disalin dengan tepat)

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

(Saya tidak mendapat peringatan kompiler)


person Jesse Laning    schedule 10.12.2018    source sumber
comment
Literal string adalah penunjuk, dan aturan bahasa menyatakan bahwa konversi penunjuk ke bool lebih disukai daripada konversi yang ditentukan pengguna (yaitu const char[] ke std::string). Lihat di sini untuk penjelasan detailnya   -  person alter igel    schedule 10.12.2018
comment
Anda dapat mencoba membuat std::string secara eksplisit, misalnya dengan meneruskan std::string("The time interval in milliseconds that it should check in."). Namun saya tidak yakin apakah ada solusi sederhana yang bisa mencegah jebakan ini terjadi secara diam-diam   -  person alter igel    schedule 10.12.2018
comment
Dengan C++17 string literal dapat digunakan: "string"s. Lihat: en.cppreference.com/w/cpp/string/ basic_string/operator%22%22s   -  person Evg    schedule 10.12.2018
comment
Terima kasih atas bantuannya, jawaban duplikat menyelesaikannya.   -  person Jesse Laning    schedule 10.12.2018