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
答案 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
与构造函数相结合意味着编译器无法执行从int
到Foo
的任何隐式转换,请求deliberately
投射它。
如果您的ctor不明确,即使这个表达式Bar('a');
也会编译。