Значение равенства c_str == строка против c_str == c_str

Я пытаюсь сравнить 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? Если нет, это стандартное поведение?

1

Решение

Это происходит потому что 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* приводит к ошибке времени компиляции, потому что указатели не определяют этот тип операции.

8

Другие решения

Просто используйте 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)
2

По вопросам рекламы [email protected]