我不明白为什么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;
}
答案 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
,而不是指向值。