String literal, czyli napis pomiędzy cudzysłowami jest w C++ typu const char[N], gdzie N to ilość znaków + 1.
Próbujesz zatem zrobić coś takiego:
char n[5];
const char literal[] = "cos";
n = literal;
Czego po prostu robić nie wolno gdyż nie można modyfikować samej tablicy.
Taki zapis:
char n[5] = "cos";
jest możliwy tylko przez pewnego rodzaju uproszczenie, gdyż taka inicjalizacja przebiega w dwóch krokach.Tworzona jest tablica na napis "cos" i dopiero jej wartości są kopiowane do tablicy n, a zapis ten oznacza "skopiowanie" tylko podczas inicjalizacji tablicy znaków. Po utworzeniu tablic nie wolno już w ten sposób przypisywać.
Podobnie jak lista inicjalizacyjna:
int tab[] = {1,2,3}; //wolno
tab = {5,6,7}; //nie wolno
Na cpp.reference można przeczytać coś takiego:
String literals have static storage duration, and thus exist in memory for the life of the program.
String literals can be used to initialize character arrays. If an array is initialized like char str[] = "foo";, str will contain a copy of the string "foo".