Oi João, tudo bem?
Em C++, há um conceito chamado "conversão implícita", que é o que está acontecendo no seu exemplo.
Quando você passa "Joao" diretamente para a classe Titular, o C++ está tratando isso como um vetor de caracteres (char[]). Mas, a classe std::string tem um construtor que aceita um vetor de caracteres como argumento, permitindo essa conversão implícita de "Joao" para um objeto do tipo std::string.
Já para o CPF, você está usando string("123.456.789-10"), o que é uma conversão explícita, onde você está dizendo diretamente ao compilador que quer que aquele valor seja tratado como uma std::string.
A razão pela qual você não precisa ser explícito com o nome é que o C++ faz essa conversão automaticamente quando encontra um construtor adequado que aceita o tipo de dado que você está passando. No caso de std::string, essa conversão implícita é suportada, por isso não é necessário especificar string("Joao").
Espero ter ajudado.
Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!
A documentação está em inglês, mas você poderá utilizar a tradução automática do navegador.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!