Qual é a diferença entre printf ("% s"), printf ("% ls"), wprintf ("% s") e wprintf ("% ls")?

Considere este programa de amostra:

#include <cstdio>
#include <cwchar>
#include <string>

int main()
{
    std::string narrowstr = "narrow";
    std::wstring widestr = L"wide";
    printf("1 %s \n", narrowstr.c_str());
    printf("2 %ls \n", widestr.c_str());
    wprintf(L"3 %s \n", narrowstr.c_str());
    wprintf(L"4 %ls \n", widestr.c_str());

   return 0;
}

A saída disso é:

1 narrow 
2 wide 

Eu estou pensando:

por que 3 e 4 não imprimiramquais são as diferenças entre 1 e 3 e 2 e 4.faz alguma diferença se narrowstr estiver em utf8 e widestr estiver em utf16?

questionAnswers(3)

yourAnswerToTheQuestion