comparação entre a string literal

Este código muito simples:

#include <iostream>

using namespace std;

void exec(char* option)
{
    cout << "option is " << option << endl;
    if (option == "foo")
        cout << "option foo";
    else if (option == "bar")
        cout << "opzion bar";
    else
        cout << "???";
    cout << endl;
}

int main()
{
    char opt[] = "foo";
    exec(opt);
    return 0;
}

gere dois avisos: a comparação com resultados literais de cadeia de caracteres em comportamento não especificado.

Você pode explicar por que exatamente esse código não funciona, mas se eu mudar

char opt[]

para

char *opt

funciona, mas gera o aviso? Está relacionado à terminação \ 0? Qual é a diferença entre as duas declarações de opt? E se eu usar o qualificador const? A solução é usar std :: string?

questionAnswers(5)

yourAnswerToTheQuestion