Почему я могу создать вектор char * из значений char * const? - PullRequest
2 голосов
/ 23 марта 2019

Я не понимаю, почему 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;
}

1 Ответ

2 голосов
/ 23 марта 2019

Это указатель на изменяемый символ:

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[]

Построить вектор str (из указателей на char) из набора постоянных указателей на 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, а не к указанному значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...