C++ 为什么我可以从char*const值创建char*向量?

C++ 为什么我可以从char*const值创建char*向量?,c++,string,pointers,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(arg

我不明白为什么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;
}
#包括
#包括
使用名称空间std;
typedef char*str;
类型定义字符*常量cstr;
int main(int argc,常数cstr argv[])
{
常量向量参数(argv+1,argv+argc);
for(str arg:参数)
{

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

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

typedef char * const cstr; 
有一种读取指针和常量声明的简单方法:从右向左读取:

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的指针(衰减数组)。最终,它是指向指向char的常量(两个常量视为一个)指针的指针:

int main(int argc, const cstr argv[]
从指向char的常量指针集合中构造str(指向char的指针)的向量。我们不关心指针本身是否为常量,因为代码不修改指针,只复制它们:

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

可以说,这种书写方式更清楚地表明const应用于变量
argv
,而不是指向的值。

问题到底是什么?你能提供更多的上下文吗?你做了什么?它做了什么?你的期望是什么?@Ayxan OP不期望代码编译,至少不是没有警告。你可能会把
const char*
char*const
混淆起来。愚蠢的,有点不相关的问题:为什么不直接使用
std::string
?你可能想谈谈西康斯特和东康斯特const@Yakk-我想了想,但这整个东进主题听起来是基于观点的,这是反对政治的无论发生什么情况,一致性都会被破坏。例如:不,我的意思是解释西常量是如何导致OP与类型定义混淆的。@Yakk AdamNevraumont实际上,问题中的类型定义cstr是东常量。另一方面,argv是西常量。我将试着写一些关于它的内容。@Yakk AdamNevraumont我已经添加了关于东常量的文本/西康斯特
int main(int argc, cstr const argv[]