Почему b [2] ложно? - PullRequest
       59

Почему b [2] ложно?

10 голосов
/ 17 октября 2019
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

устанавливает

b[] = {true, true, false};

почему b[2] ложно?

Если A==B и A==C, не означает ли это B==C?

1 Ответ

14 голосов
/ 17 октября 2019

В этом выражении

s.c_str()==""

сравниваются два указателя (адреса). Первый - это указатель, возвращаемый s.c_str(), а второй - указатель на первый символ (конечный нулевой символ) строкового литерала "".

Очевидно, что адреса разные (помните также, что строковый литерал имеет статическую длительность хранения).

Чтобы получить ожидаемый результат, вы должны написать вместо этого

std::strcmp( s.c_str(), "" ) == 0

Что касается этих двух выражений

s==""

и

s==s.c_str()

затем сравниваются строки, потому что стандартный класс std :: string имеет перегруженный оператор == для правого операнда.

...