Явный конструктор и static_cast

struct Foo
{
    explicit Foo(int a):m(a){}
    int padd1, m, padd2;
};

void Bar(Foo){}

int main()
{
    Bar(11); // OK, gives error
    auto x = static_cast<Foo>(37);
    x.m;
}

Это нормально, что static_cast создает объект Foo, хотя его конструктор помечен explicit?

Он работает в MSVC2013 и GCC http://ideone.com/dMS5kB.


person relaxxx    schedule 22.09.2015    source источник
comment
возможный дубликат Когда приведения вызывают конструктор нового тип?   -  person Paolo M    schedule 22.09.2015


Ответы (2)


Да, static_cast будет использовать конструктор explicit.

5.2.9 Статическое приведение [expr.static.cast]

4 Выражение e может быть явно преобразовано в тип T с помощью static_cast формы static_cast<T>(e), если объявление T t(e); правильно сформировано для некоторой изобретенной временной переменной t (8.5). Эффект такого явного преобразования такой же, как при выполнении объявления и инициализации с последующим использованием временной переменной в качестве результата преобразования. Выражение e используется как значение gl тогда и только тогда, когда инициализация использует его как значение gl.

person TemplateRex    schedule 22.09.2015

explicit в сочетании с конструктором означает, что компилятор не будет выполнять неявное преобразование из int в Foo , запрашивая его deliberately приведения.

Если бы ваш ctor не был явным, даже это выражение Bar('a'); скомпилировалось бы.

person Angelus Mortis    schedule 22.09.2015