如何在c ++中将命令行参数的整个集合(char**)作为只读传递?

Jay*_*can 7 c++ pass-by-reference char-pointer pass-by-pointer

假设我有一个这样的程序:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我要尝试将main()函数的char**参数传递给另一个函数或类.(我知道有更好的方法可以实现上述程序的功能,我的问题是将char**参数作为只读方式传递).

问题:

  1. 我发现我不能像第一个那样使第二个foo()参数成为const.为什么是这样?char**无法转换为const char**?
  2. 我想把这个论点称为"只读".我不知道如何解决这个问题,如果它是一个字符串我会通过const引用传递它,但我不知道如何用指针来解决这个问题?

Sto*_*ica 9

我发现我不能像第一个那样使第二个foo()参数成为const.为什么是这样?char**无法转换为const char**?

如果它被允许,你可能会破坏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!
Run Code Online (Sandbox Code Playgroud)

所以有充分理由不遵守它.但这并不意味着你根本不能做你想做的事.只要更严格,资格转换是可能的.嗯,无论如何,这是它的要点.

我想把这个论点称为"只读".我不知道如何解决这个问题,如果它是一个字符串我会通过const引用传递它,但我不知道如何用指针来解决这个问题?

将指针传递给指向const char 的const指针.最好用代码写出来解释:

                                                         // 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;
}
Run Code Online (Sandbox Code Playgroud)

为什么允许这样做?因为如果我们把它等同于我开始的坏例子,c就不能再用来分配b,所以我们不能进入错误的状态.