显式构造函数和static_cast

rel*_*xxx 4 c++ explicit 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;
}
Run Code Online (Sandbox Code Playgroud)

即使构造函数被标记,static_cast构造Foo对象也没关系explicit吗?

它适用于MSVC2013和GCC http://ideone.com/dMS5kB

Tem*_*Rex 6

是的,static_cast将使用explicit构造函数.

5.2.9静态强制转换[expr.static.cast]

4.一种表达式e可以显式转换到使用以下形式的的static_cast类型T static_cast<T>(e),如果声明T t(e); 是良好的形成,对于某些发明临时变量t(8.5).这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换结果相同.当且仅当初始化将其用作glvalue时,表达式e用作glvalue.