Simply put: A String literal is created in global memory with the exact space it needs. If you use "a"+"b", this creates two strings of size 2 (const char[2]) in memory and causes the compiler to generate code to add them at runtime. Now where should the resulting String "ab" go? there is no place to store it. Adding two arrays is not possible. Hence the error. (btw: adding two pointers IS possible, it just doesn't make sense, and there is no trigger for converting the const char[2] into a char* when trying to add them)
You can instruct the compiler to just concatenate the two string literal expressions at compile time, as if they were one string literal. This is done by just putten them one after the other without anything but whitespace between them. The compiler will then treat them as one literal. This also works with defined constants:
#define TEXT1 "A"
#define TEXT2 "B"
...(string + TEXT1 TEXT2)
If you use the preprocessor, things are different. Here you concatenate string literals with # and ##