Ответ 1
Строковые литералы представляют собой массив const char, мы можем видеть это из черновика стандартного раздела С++ 2.14.5
Строковые литералы, в котором говорится (подчеркивание мое):
Обычные строковые литералы и строковые литералы UTF-8 также называются узкими строковыми литералами. Узкий строковый литерал имеет тип "массив из n const char" , где n - размер строки, как определено ниже, и имеет статическую продолжительность хранения (3.7).
чтобы это изменение удалило предупреждение:
const char * commandsForGnuplot[] = {"set title \"Probability Graph\"", "plot 'data.temp' with lines"};
^^^^^
Замечание, позволяющее * not-const char ** указывать на const-данные, является плохой идеей, так как изменение константы или строкового литерала undefined. Мы можем видеть это, перейдя в раздел 7.1.6.1
. Cv-квалификаторы, которые говорят:
За исключением того, что любой член класса, объявленный mutable (7.1.1), может быть изменен, любая попытка изменить объект const в течение его жизненного цикла (3.8) в режиме undefined.
и раздел 2.14.5
Строковые литералы, в которых говорится:
Являются ли все строковые литералы различными (то есть, хранятся в неперекрывающиеся объекты) определяется реализацией. Эффект попытка изменить строковый литерал undefined.