安全,检查强制转换为C++基类而不使用额外的行

Geo*_*ing 3 c++ casting

假设我有B从类继承的类A,并考虑以下代码:

void f(B& b) {
  A& a = b;
  g(a);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法避免演员的额外线?请注意,以下static_cast版本不相同,因为除了向下转换之外它还允许向上转换:

// Potentially dangerous: doesn't check that B inherits from A
void f(B& b) {
  g(static_cast<A&>(b));
}
Run Code Online (Sandbox Code Playgroud)

编辑:我不能依靠隐式强制来完全避免演员阵容,就像Brian的回答一样.今天的原因是g模板,我想避免不必要的实例化,但过去还有其他原因.在任何情况下,我都需要某种显式转换来获取类型的值A&.

Bri*_*ian 6

如果g有原型

void g(A& a);
Run Code Online (Sandbox Code Playgroud)

那么根本不需要演员阵容; 代替

g(b)
Run Code Online (Sandbox Code Playgroud)

只要确实从中派生出lvalue,就会隐式地将lvalue转换B为lvalue .如果来源于,编译将失败(除非出于某种奇怪的原因您添加从用户定义的转换到...)ABAABBA

编辑:如果你真的需要参数的类型为"左值A"并且想避免转换为派生类,那么请考虑boost :: implicit_cast.