#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 и т.п.) , можно условно считать, что есть конструкторы копирования, а также операторы преобразования в другие простые типы Ответ: строчки эквивалентны.
Комментариев нет:
Отправить комментарий