Я пытаюсь сравнить libpqxx c_str
ценности.
Если я попытаюсь сравнить их напрямую, result1[0][0].c_str() == result2[0][0].c_str()
например, они не return true
когда они имеют одинаковые строковые значения. Единственный способ сравнить их правильно — это использовать strcmp
,
Однако, если я сравниваю libpqxx c_str
к std::string
с strcmp
Компилятор жалуется, что аргумент strcmp
не может быть std::string
и все же самое странное для меня: если я сравниваю что-то вроде result1[0][0].c_str() == some_std_string
сравнение будет return true
если они обладают одинаковой ценностью, false
иначе.
Почему это? Это что-то особенное для libpqxx? Если нет, это стандартное поведение?
Это происходит потому что std::string
это класс, а const char*
(тип, возвращаемый c_str
) это, ну, тип указателя. Сравнение указателей возвращается true
если указатели указывают на одну и ту же ячейку памяти. С другой стороны, классы могут определять, что для них значит равенство.
поскольку string
с и const char*
довольно аналогичны, string
класс определяет метод сравнения строковых объектов с const char*
указатели. Он также определяет, как конвертировать char
указатель на строку. Тем не менее, это по сути улица с односторонним движением, так как она не определяет, как создать const char*
из строки, используя простые операторы или неявные преобразования. Вот почему вы не можете использовать strcmp
на них.
Strcmp
это функция из стандартной библиотеки C. C не имеет классов и типы не могут определять базовое поведение, как классы C ++. Следовательно, C определяет набор функций для работы с указателями на символы и только с указателями на символы.
Такое несоответствие между указателями на символы и строками не ограничивается равенством. Например, std::string
поддерживает объединение с +
оператор: это означает, что string + string
работает, const char* + string
работает, string + const char*
работает, но const char* + const char*
приводит к ошибке времени компиляции, потому что указатели не определяют этот тип операции.
Просто используйте c_str()
, тоже!
if (strcmp(result1[0][0].c_str(), some_std_string.c_str()) == 0)
{
...
или использовать operator ==
из std::string
if (result1[0][0].c_str() == some_std_string)