c++ - 为什么我可以从 char * const 值创建 char * vector ?

标签 c++ string pointers

我不明白为什么 vc++ 和 g++ 让我从 char * const 值初始化 vector < char * >。

#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;
}

最佳答案

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

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 的指针:

int main(int argc, const cstr argv[]

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

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

这里没问题。


请注意,在类型左侧写入 const 通常称为“west const”,或者讽刺地称为 const west。相反,在右侧写const通常称为east const。从语义上讲,east constwest const 是等效的。

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

int main(int argc, cstr const argv[]

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

关于c++ - 为什么我可以从 char * const 值创建 char * vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55307712/

相关文章:

c++ - 我可以依赖一个新的 bool 被初始化为 false 吗?

c++ - 在 UNIX 中输出退格字符

string - 在 Arduino 上将 int 或 String 转换为 char 数组

php:在空白处将字符串分成两半,直到结果部分都不长于 x 个单词

c++ - 字符串操作 C++

c - 数组的指针数组在 C 中不起作用

c++ - 在 C++ : invalid conversion from ‘void*’ to ‘uv_loop_t* 中避免 malloc

c++ - 模板多态性和unique_ptr

c++ - 不分配任何 char 内存的 const 字符串构造函数?

c++ - 模拟退火算法