为什么要从char * const值创建char *的向量?

时间:2019-03-22 21:01:05

标签: c++ string pointers

我不明白为什么vc ++和g ++让我从char * const值初始化向量

#include <iostream>
#include <vector>
using namespace std;

typedef char *          str;
typedef char * const    cstr;

int main(int argc, const cstr argv[])
{
    const vector<str> arguments(argv + 1, argv + argc);
    for (str arg : arguments)
    {
        cout << arg << endl;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:2)

这是指向可变字符的指针:

typedef char * str; 

这是指向可变char的常量指针。指针不能更改,但指向的字符可以修改:

typedef char * const cstr; 

有一种简单的方法可以读取指针和const声明:从右到左读取它:

T * const x; // x is a constant that points to an object of type T
T const * x; // x points to a constant object of type T.

这个argv是一个指向常数cstr的指针(一个衰减数组)。最终,这是一个指向常量的指针(将两个const视为一个)指向char的指针:

int main(int argc, const cstr argv[]

从指向char的常量指针的集合中构造str(指向char的指针)的向量。我们不在乎指针本身是常量,因为代码不会修改指针,而只复制它们:

const vector<str> arguments(argv + 1, argv + argc)

没问题。


请注意,在该类型的左侧写const通常被称为“ west const ”,或者有些讽刺地称为const west。相反,在右边写const通常被称为east const。在语义上,east const west const 是等效的。

该问题中的argv使用 west const 表示法,因为const位于cstr的左侧。如果您一直都使用east const,那么它看起来应该是:

int main(int argc, cstr const argv[]

可以说,这种书写方式使const更适用于变量argv,而不是指向值。