Это просто ситуация, когда const в стиле C / C ++ работает не очень хорошо. На самом деле ядро не собирается изменять аргументы, передаваемые exec (). Он просто скопирует их, когда создаст новый процесс. Но система типов не достаточно выразительна, чтобы по-настоящему справиться с этим.
Многие люди на этой странице предлагают сделать exec take "char **" или "const char * const []". Но ни один из них на самом деле не работает для вашего оригинального примера. «char **» означает, что все изменчиво (конечно, это не так для строковой константы «/ usr / bin / what»). «const char * const []» означает, что ничто не является изменяемым. Но тогда вы не можете присвоить какие-либо значения элементам массива, так как сам массив тогда является постоянным.
Лучшее, что вы могли бы сделать, это иметь константу C времени компиляции, такую как:
const char * const args[] = {
"/usr/bin/whatever",
filename.c_str(),
someparameter.c_str(),
0};
Это на самом деле будет работать с предложенной сигнатурой типа "const char * const []". Но что, если вам нужно переменное количество аргументов? Тогда у вас не может быть постоянной времени компиляции, но вам нужен изменяемый массив. Итак, вы вернулись к обману. Это реальная причина, по которой сигнатура типа exec принимает в качестве аргументов "const char **".
Кстати, проблемы в C ++ такие же. Вы не можете передать std :: vector в функцию, которая нуждается в std :: vector . Вы должны типизировать или скопировать весь std :: vector.