Как передать всю коллекцию (char **) аргументов командной строки только для чтения в c ++? - PullRequest
0 голосов
/ 11 февраля 2019

Предположим, у меня есть программа наподобие этой:

#include <iostream>
#include <string>
#include <vector>

// Takes values and outputs a string vector.
std::vector<std::string> foo(const int argc, char* args[]) {
    std::vector<std::string> strings;
    for (int i = 0; i < argc; i++)
        strings.push_back(args[i]);
    return strings;
}

int main(int argc, char *args[]) {

    std::vector<std::string> strings = foo(argc, args);

    for (unsigned int i = 0; i < strings.size(); i++)
        std::cout << strings[i] << std::endl;

    return 0;
}

. Здесь я хочу передать аргумент char ** функции main () другой функции или классу.(Я понимаю, что есть лучшие способы добиться того, что делает вышеуказанная программа, мой вопрос о том, чтобы передавать аргументы char ** только для чтения).

Вопросы:

  1. У меня естьобнаружил, что я не могу сделать второй аргумент foo () константным, как первый.Почему это?Символ ** не может быть преобразован в постоянный символ **?
  2. Я хочу передать этот аргумент как «только для чтения».Я не уверен, как это сделать, если бы это было, скажем, строка, которую я бы передал через константную ссылку, но я не уверен, как это сделать с помощью указателей?

1 Ответ

0 голосов
/ 11 февраля 2019

Я обнаружил, что не могу сделать второй аргумент 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, и поэтому мы не можем попасть в ошибочное состояние.

...