Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

Операторы приведения в C++

Читаю сейчас "Discovering Modern C++", и есть там одно место, где автор пишет, что в С++ есть четыре оператора приведения (всем знакомые ..._cast) и унаследованный из C оператор (type)expr
В связи с этим очередной теоретический вопрос: автор забыл о приведении type(expr) или это приведение вообще говоря не является приведением, по сути являясь созданием объекта типа type из expr? ну, или применением оператора преобразования типа? Ведь вроде бы тут говорится, что это тоже преобразование типа?
И еще - а есть ли вообще разница между преобразованием (conversion) и приведением (cast) или это синонимы?
И еще о лингвистике :) - у него четко различаются casting Up (от производного к базовому) и casting Down (понятно, наоборот)... Но что-то я в нашей литературе таких терминов раньше не встречал?


Ответ

В связи с этим очередной теоретический вопрос: автор забыл о приведении type(expr)
Это можно считать приведением(так пишет Майерс и другие называют это приведением), но в стандарте это не входит в список операторов приведения(cast operators). Т.е. формально, данный синтаксис не является синтаксисом приведения. Он в стандарте имеет своё имя: functional notation. В сущности, это создание объекта инициализированного expr. Это вызов конструктора.
И еще - а есть ли вообще разница между преобразованием (conversion) и приведением (cast) или это синонимы?
Первое это существительное, второе — глагол(чаще). Нет, разницы, с точки зрения языка, — нет.
Но что-то я в нашей литературе таких терминов раньше не встречал?
Я нашу литературу давно не читаю, но если это перевод книги, в которой есть up-casting и down-casting, это не может быть не переведено.

Из стандарта про синтаксис из вопроса: [expr.type.conv]p2
A simple-type-specifier (7.1.6.2) or typename-specifier (14.6) followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4) <...>
Где corresponding cast expression это (T)expression

Комментариев нет:

Отправить комментарий