为啥我可以从 char * const 值创建 char * 向量?

Posted

技术标签:

【中文标题】为啥我可以从 char * const 值创建 char * 向量?【英文标题】:Why can I create a vector of char * from char * const values?为什么我可以从 char * const 值创建 char * 向量? 【发布时间】:2019-03-22 21:01:05 【问题描述】:

我不明白为什么 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;

【问题讨论】:

到底是什么问题? 你能提供更多的上下文吗?你试过什么?它做了什么?你的期望是什么? @Ayxan OP 不希望代码编译,至少不会没有警告。 您可能会将const char *char * const 混淆。 愚蠢,有点不相关,问题:为什么不直接使用std::string 【参考方案1】:

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

typedef char * str; 

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

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

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 constwest const 是等价的。

问题中的argv 使用west const 表示法,因为constcstr 的左侧。如果你一直使用east const,那么它看起来会是:

int main(int argc, cstr const argv[]

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

【讨论】:

你可能想谈谈 west const 与 east const @Yakk-AdamNevraumont 我想了想,但是这整个东进主题听起来都是基于意见的,这违反了政策。无论如何,类型声明的一致性都被破坏了。例如:youtu.be/_27NHB1OlNI 不,我的意思是解释 west const 是如何导致 OP 与 typedef 混淆的。 @Yakk-AdamNevraumont 实际上,问题中的 typedef cstr 是东部常量。另一方面, argv 是 west const。我会试着写一些关于它的。 @Yakk-AdamNevraumont 我添加了关于东/西常量的文本

以上是关于为啥我可以从 char * const 值创建 char * 向量?的主要内容,如果未能解决你的问题,请参考以下文章

可以/为啥在返回类型中使用 char * 而不是 const char * 会导致崩溃?

为啥 const char* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]

为啥从 int 到 const char* 的转换会破坏 C++ [重复]

为啥 std::string_view 比 const char* 快?

C++ 从 'char' 到 'const char' 的无效转换

为啥“char*”可以指向“const char*”?