1

Тема: Оголошення змінних з використанням const. + Посилання і вказівники

Сиджу в Visual Studio 2013 на C++ (звичайному, без CLR) і вводжу рядок:

int i0 = 0,
    const *const i1 = &i0,
    const &const i2 = i0,
    const *const *const i3 = &i1,
    const &&const i4 = 4;

я очікував, що отримаю змінні такі як тут:

int i0 = 0;
int const *const i1 = &i0;
int const &i2 = i0;
int const *const *const i3 = &i1;
int const &&i4 = 4;

але компілятор вирішив інакше:

int i0 = 0;
int *const i1 = &i0;
int &i2 = i0;
int *const *const i3 = &i1;
int &&i4 = 4;

Чому компілятор не бачить першого входження const у всі змінні крім першої ?

Цікаво, що якщо зробити наоборот:

int const i0 = 0,
    *const i1 = &i0,
    &const i2 = i0,
    *const *const i3 = &i1,
    &&const i4 = 4;

я очікував:

int const i0 = 0;
int *const i1 = &i0;
int &i2 = i0;
int *const *const i3 = &i1;
int &&i4 = 4;

але компілятор:

int const i0 = 0;
int const *const i1 = &i0;
int const &i2 = i0;
int const *const *const i3 = &i1;
int const &&i4 = 4;

Чи є якась специфікація (описаний стандарт), де можна прочитати чому компілятор так робить ? чи це тільки Visual Studio таке витворяє ?
Хто сидить на інших компіляторах, розкажіть, у Вас таке саме ?

Ви мабуть спитаєте нащо я поставив const після & і &&. Я не знаю, захотілось поекспериментувати.

Подякували: FakiNyan, YurkoFlisk, Yola3

2

Re: Оголошення змінних з використанням const. + Посилання і вказівники

Читаємо вказівники і const-и справа наліво:

int i0 = 0, //i0 - int
    const *const i1 = &i0,//i1 - константний вказівник на константний int
    const &const i2 = i0, //i2 - константне посилання (whatever) на константний int
    const *const *const i3 = &i1, //i3 - константний вказівник на константний вказівник на константний int
    const &&const i4 = 4; //i4 - константне rvalue-посилання на константний int

Посилання проголошувати const-ами не має сенсу, так само, як і простий тип чи складний без посилань оголошувати по rvalue.

А те, що бачить у вас компілятор - будь ласка, надавайте або посвідчення сисадміна-телепата, здатного читати прямо з пам'яті, або вивід програми.

Подякували: Yola, leofun012

3 Востаннє редагувалося YurkoFlisk (08.06.2016 21:40:26)

Re: Оголошення змінних з використанням const. + Посилання і вказівники

На VS 2015 діється така сама дивина. Ось таке без проблем компілюється і запускається:

int a, const* b = &a;
*b = 45;

Хоча, якщо замінити const на constexpr, перестає компілюватись, і тип b в IntelliSense показується правильно.

koala написав:

А те, що бачить у вас компілятор - будь ласка, надавайте або посвідчення сисадміна-телепата, здатного читати прямо з пам'яті, або вивід програми.

IntelliSense у VisualStudio дозволяє побачити тип змінної

Подякували: Yola, leofun012

4 Востаннє редагувалося Yola (09.06.2016 06:11:02)

Re: Оголошення змінних з використанням const. + Посилання і вказівники

    int i0 = 0
        const *const i1 = &i0;

Warning    C4228    nonstandard extension used: qualifiers after comma in declarator list are ignored   

Раджу Project->Properties->C/C++->Warning_Level встановити у Level4.

Подякували: koala, Arete, leofun01, YurkoFlisk4

5

Re: Оголошення змінних з використанням const. + Посилання і вказівники

YurkoFlisk написав:

IntelliSense у VisualStudio дозволяє побачити тип змінної

Так компілятор чи IntelliSense?

Подякували: leofun011

6 Востаннє редагувалося leofun01 (09.06.2016 07:29:41)

Re: Оголошення змінних з використанням const. + Посилання і вказівники

koala написав:

А те, що бачить у вас компілятор - будь ласка, надавайте або посвідчення сисадміна-телепата, здатного читати прямо з пам'яті, або вивід програми.

Ваша правда, вийшло якось негарно з мого боку, не перевірив вивід.

Yola написав:
    int i0 = 0
        const *const i1 = &i0;

Warning    C4228    nonstandard extension used: qualifiers after comma in declarator list are ignored   

Раджу Project->Properties->C/C++->Warning_Level встановити у Level4.

О це так поворот, дякую.

koala написав:
YurkoFlisk написав:

IntelliSense у VisualStudio дозволяє побачити тип змінної

Так компілятор чи IntelliSense?

Винен, таки IntelliSense. Але компілятор теж мабуть ...