Страницы

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

среда, 22 января 2020 г.

Преобразование типов и конструктор преобразования

#cpp


Полностью ли эквивалентны две строки ниже   

auto s1 = Foo(x);
auto s2 = (Foo)x;


С одной стороны T(x) это конструктор по стандарту, а с другой http://en.cppreference.com/w/cpp/language/explicit_cast
говорит, что строки идентичны.
    


Ответы

Ответ 1



Да, полностью эквивалентны. Первое - это явное приведение типа в функциональной нотации, второе - это явное приведение типа в каст-нотации. Спецификация языка открытым текстом говорит, что если явное приведение типа в функциональной нотации имеет ровно один аргумент (т.е. ровно одно выражение внутри ()), то оно строго эквивалентно явному приведению типа в каст-нотации. 5.2.3 Explicit type conversion (functional notation) [expr.type.conv] 1 [...] 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). [...] То есть по определению выражение вида Foo(x) сразу же рассматривается языком С++ как выражение (Foo) x.

Ответ 2



Конструкция: auto s1 = Foo(x); вызывает конструктор того типа, который имеет принимающая сторона. То есть: Foo::Foo(const T& other) А конструкция: auto s2 = (Foo)x; в свою очередь вызывает оператор приведения типа отправляющей стороны. То есть: Bar::operator Foo(const Foo& other)

Ответ 3



В обоих случаях компилятор постарается сначала найти подходящий конструктор у класса Foo с одним обязательным параметром, такой конструктор что в него можно было бы передать x, и вызовет его. А если нет такого подходящего конструктора, то для типа, к которому относится x, начнет искать оператор преобразования в тип Foo, и вызовет его. Если и его нет, то компилятор выдаст ошибку. У простых типов (int, char, float и т.п.) , можно условно считать, что есть конструкторы копирования, а также операторы преобразования в другие простые типы Ответ: строчки эквивалентны.

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

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