Я обнаружил, что не могу сделать второй аргумент foo () таким же, как первый.Почему это?Символ ** не может быть преобразован в постоянный символ **?
Если бы это было разрешено, вы бы могли нарушить правильность const.Подумайте об этом
char const *a = "literl";
char *b = nullptr;
char const **c = &b; // This is not allowed in C++. Like your code.
*c = a; // The qualifications match, but now it's b that points at a literal.
*b = 'L'; // Modifying a string literal! Oops!
Так что есть веская причина запретить это как написано.Но это не значит, что вы не можете делать то, что хотите.Квалификационные преобразования возможны, если они более строгие.В любом случае, в этом суть.
Я хочу передать этот аргумент как «только для чтения».Я не уверен, как это сделать, если бы это было, скажем, строка, которую я передал бы через константную ссылку, но я не уверен, как это сделать с помощью указателей?
Передайте указатель на const указатель на const char.Лучше напишите это в коде, чтобы объяснить:
// The const here
std::vector<std::string> foo(int const argc, char const* const args[]) {
std::vector<std::string> strings;
for (int i = 0; i < argc; i++)
strings.push_back(args[i]);
return strings;
}
Почему это разрешено?Потому что, если мы отождествим его с плохим примером, с которого я начал, c
больше не может быть использован для присвоения b
, и поэтому мы не можем попасть в ошибочное состояние.