Информация об изменениях

Сообщение Re[19]: Зачем плюс? от 28.11.2018 15:03

Изменено 28.11.2018 15:12 rg45

Re[19]: Зачем плюс?
Здравствуйте, B0FEE664, Вы писали:

BFE>Ну я не знаю. В стандарте написано по другому:

BFE>

BFE>typedef int& A;
BFE>const A aref = 3;
BFE>// ill-formed; lvalue reference to non-const initialized with rvalue
BFE>The type of aref is “lvalue reference to int”, not “lvalue reference to const int”.

BFE>На мой взгляд, то , что взято в кавычки: “lvalue reference to int” является названием типа. Поэтому, на мой взгляд, ваша интерпретация типов не верна. Я ошибаюсь? Где?

Я попробую дать объяснение, как я это понимаю, да простят мне гуру вероятные неточности.

Важно четко понимать смысл таких сущностей как "тип", "выражение" и "объект" и их соотношения. Согласно 6.9:

Types describe objects (4.5), references (11.3.2), or functions (11.3.5).


Заметьте, о выражениях пока ни слова.

Идем дальше: "6.10 Lvalued and rvalues". "Expressions are categorized according to the taxonomy." И далее идет хорошо известная всем картинка:



Из которой понятно, что все эти страшные слова "glvalue", "prvalue", "xvalue", etc — это категории выражений. и чтобы установить мостик между понятиями "тип" и "выражение" нам нужно найти связь между выражениями и теми сущностями, которые описывают типы (objects, references functions). И связь эта находится тут же, прямо под картинкой:

(1.1) — A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
(1.2) — A prvalue is an expression whose evaluation initializes an object or a bit-field, or computes the value of the operand of an operator, as specified by the context in which it appears.
(1.3) — An xvalue is a glvalue that denotes an object or bit-field whose resources can be reused (usually because it is near the end of its lifetime)...
(1.4) — An lvalue is a glvalue that is not an xvalue.
(1.5) — An rvalue is a prvalue or an xvalue.


Таким образом, когда мы говорим о типе выражения мы всегда подразумеваем тип объекта или ссылки, которые сопоставлены данному выражению, прямо или косвенно, не забывая при этом о категории самого выражения.

Возвращаясь к примеру:

typedef int& A;
const A aref = 3;
// ill-formed; lvalue reference to non-const initialized with rvalue
The type of aref is “lvalue reference to int”, not “lvalue reference to const int”.


Мы говорим, что здесь присутствуют: неконстантная lvalue ссылка aref, имеющая тип int&. И prvalue выражение '3', вычисление которого инициализирует объект типа int. Или проще — prvalue типа int — я бы так сказал и не парился. Ну и понятно, что prvalue не может быть связано с неконстантной lvalue ссылкой, поэтому компилятор ругается.
Re[19]: Зачем плюс?
Здравствуйте, B0FEE664, Вы писали:

BFE>Ну я не знаю. В стандарте написано по другому:

BFE>

BFE>typedef int& A;
BFE>const A aref = 3;
BFE>// ill-formed; lvalue reference to non-const initialized with rvalue
BFE>The type of aref is “lvalue reference to int”, not “lvalue reference to const int”.

BFE>На мой взгляд, то , что взято в кавычки: “lvalue reference to int” является названием типа. Поэтому, на мой взгляд, ваша интерпретация типов не верна. Я ошибаюсь? Где?

Я попробую дать объяснение, как я это понимаю, да простят мне гуру вероятные неточности.

Важно четко понимать смысл таких сущностей как "тип", "выражение" и "объект" и их взаимоотношения. Согласно 6.9:

Types describe objects (4.5), references (11.3.2), or functions (11.3.5).


Заметьте, о выражениях пока ни слова.

Идем дальше: "6.10 Lvalued and rvalues". "Expressions are categorized according to the taxonomy." И далее идет хорошо известная всем картинка:



Из которой понятно, что все эти страшные слова "glvalue", "prvalue", "xvalue", etc — это категории выражений. и чтобы установить мостик между понятиями "тип" и "выражение" нам нужно найти связь между выражениями и теми сущностями, которые описывают типы (objects, references functions). И связь эта находится тут же, прямо под картинкой:

(1.1) — A glvalue is an expression whose evaluation determines the identity of an object, bit-field, or function.
(1.2) — A prvalue is an expression whose evaluation initializes an object or a bit-field, or computes the value of the operand of an operator, as specified by the context in which it appears.
(1.3) — An xvalue is a glvalue that denotes an object or bit-field whose resources can be reused (usually because it is near the end of its lifetime)...
(1.4) — An lvalue is a glvalue that is not an xvalue.
(1.5) — An rvalue is a prvalue or an xvalue.


Таким образом, когда мы говорим о типе выражения мы всегда подразумеваем тип объекта или ссылки, которые сопоставлены данному выражению, прямо или косвенно, не забывая при этом о категории самого выражения.

Возвращаясь к примеру:

typedef int& A;
const A aref = 3;
// ill-formed; lvalue reference to non-const initialized with rvalue
The type of aref is “lvalue reference to int”, not “lvalue reference to const int”.


Мы говорим, что здесь присутствуют: неконстантная lvalue ссылка aref, имеющая тип int&. И prvalue выражение '3', вычисление которого инициализирует объект типа int. Или проще — prvalue типа int — я бы так сказал и не парился. Ну и понятно, что prvalue не может быть связано с неконстантной lvalue ссылкой, поэтому компилятор ругается.