显式构造函数和static_cast

时间:2015-09-22 09:18:32

标签: 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;
}

没问题,static_cast构造Foo对象即使其构造函数标记为explicit吗?

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

2 个答案:

答案 0 :(得分:6)

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

  

5.2.9静态演员[expr.static.cast]

     

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

答案 1 :(得分:1)

explicit与构造函数相结合意味着编译器无法执行从intFoo的任何隐式转换,请求deliberately投射它。

如果您的ctor不明确,即使这个表达式Bar('a');也会编译。