Por que b [2] é falso?

11
string s;
bool b[] = {s=="",  s==s.c_str(),  s.c_str()==""};

conjuntos

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

porque é b[2]falso?

Se A==Be A==C, isso não deveria implicar B==C?

Não compreende
fonte
Questão relacionada: C ++ if usando cordas não funciona como pretendido
François Andrieux
Agora vejo meu erro e tenho uma sensação de déjà vu, pois não é a primeira vez que me confundo comparando indicadores.
NoComprende 17/10/19

Respostas:

14

Nessa expressão

s.c_str()==""

são comparados dois ponteiros (endereços). O primeiro é o ponteiro retornado por s.c_str()e o segundo é o ponteiro para o primeiro caractere (terminando o caractere zero) da string literal "".

É evidente que os endereços são diferentes (lembre-se também de que a string literal tem a duração do armazenamento estático).

Para obter o resultado esperado, você deve escrever

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

Quanto a essas duas expressões

s==""

e

s==s.c_str()

há seqüências comparadas porque a classe padrão std :: string sobrecarregou o operador == para o operando certo.

Vlad de Moscou
fonte
O padrão garante que os ponteiros sejam diferentes, no último caso? Eu entendo que eles podem ser.
Jeffrey
Só é possível adicionar que ele deve ser UB. "comparação com resultados literais de strings em comportamento não especificado"
Roout 17/10/19
@ Jeffrey É garantido porque pelo menos a string está vazia. :) Mas, em qualquer caso, a classe std :: string usa uma cópia de um argumento de seu construtor.
Vlad de Moscou
11
@Roout - "UB" significa comportamento indefinido ". Isso significa que a definição de linguagem não informa qual é o comportamento do programa ** . Um programa com comportamento indefinido não é um programa C ++ válido." Comportamento não especificado "significa que existem várias alternativas, e o padrão não lhe dizer qual desses será escolhido o programa é válido, ea implementação pode escolher qualquer uma das alternativas..
Pete Becker
@PeteBecker um programa com UB ainda é um programa C ++ válido (pelo menos no sentido de compilar com êxito e poder ser executado).
trolley813