Сообщение Re[19]: Зачем плюс? от 28.11.2018 15:03
Изменено 28.11.2018 15:12 rg45
BFE>Ну я не знаю. В стандарте написано по другому:
BFE>
BFE>На мой взгляд, то , что взято в кавычки: “lvalue reference to int” является названием типа. Поэтому, на мой взгляд, ваша интерпретация типов не верна. Я ошибаюсь? Где?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”.
Я попробую дать объяснение, как я это понимаю, да простят мне гуру вероятные неточности.
Важно четко понимать смысл таких сущностей как "тип", "выражение" и "объект" и их соотношения. Согласно 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 ссылкой, поэтому компилятор ругается.
BFE>Ну я не знаю. В стандарте написано по другому:
BFE>
BFE>На мой взгляд, то , что взято в кавычки: “lvalue reference to int” является названием типа. Поэтому, на мой взгляд, ваша интерпретация типов не верна. Я ошибаюсь? Где?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”.
Я попробую дать объяснение, как я это понимаю, да простят мне гуру вероятные неточности.
Важно четко понимать смысл таких сущностей как "тип", "выражение" и "объект" и их взаимоотношения. Согласно 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 ссылкой, поэтому компилятор ругается.