为啥我可以从 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 const
和 west const 是等价的。
问题中的argv
使用west const 表示法,因为const
在cstr
的左侧。如果你一直使用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* 快?