2015-09-22 3 views
4
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?Явный конструктор и static_cast

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

+0

Возможный дубликат [Когда выполняются броски, вызывающие конструктор нового типа?] (Http://stackoverflow.com/questions/6260989/when-do-casts-call-the-constructor-of-the-new- тип) –

ответ

6

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

5.2.9 Статический литой [expr.static.cast]

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

1

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

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

Смежные вопросы