Почему используется implicit_cast(int) вместо static_cast(int)?

#c #boost #boost-implicit-cast

#c #повысить #boost-implicit-cast

Вопрос:

Я прочитал некоторый код в muduo, сетевой библиотеке с открытым исходным кодом, и обнаружил, что автор использует implicit_cat<size_t>(int) , а не static_cast<size_t>(int) во многих местах. Определение implicit_cast выглядит следующим образом:

 // Use implicit_cast as a safe version of static_cast or const_cast
// for upcasting in the type hierarchy (i.e. casting a pointer to Foo
// to a pointer to SuperclassOfFoo or casting a pointer to Foo to
// a const pointer to Foo).
// When you use implicit_cast, the compiler checks that the cast is safe.
// Such explicit implicit_casts are necessary in surprisingly many
// situations where C   demands an exact type match instead of an
// argument type convertable to a target type.
//
// The From type can be inferred, so the preferred syntax for using
// implicit_cast is the same as for static_cast etc.:
//
//   implicit_cast<ToType>(expr)
//
// implicit_cast would have been part of the C   standard library,
// but the proposal was submitted too late.  It will probably make
// its way into the language in the future.
template<typename To, typename From>
inline To implicit_cast(From const amp;f)
{
  return f;
}
  

Я могу понять, что означает комментарий. Вот пример:

 class Top{};
class MiddleA : public Top{};
class MiddleB : public Top{};
class Bottom : public MiddleA, public MiddleB{};
void func(MiddleA constamp; A){
    cout << "A" << endl;
}
void func(MiddleB constamp; B){
    cout << "B" << endl;
}
int main(){
    Top bot;
    func(implicit_cast<MiddleA constamp;>(bot));  //error
    func(implicit_cast<MiddleB constamp;>(bot)); //error
}
  

Когда дело доходит до повышения в иерархии типов, implicit_cast может определить, является ли приведение от типа From к типу To законным, в то время static_cast как не может. Но зачем использовать implicit_cast<size_t>(int) вместо static_cast<size_t>(int) ?
Я предполагаю, что для этого есть две возможные причины:

  • implicit_cast более значимо, чем static_cast
  • size_t зависит от реализации, поэтому implicit_cast безопаснее, чем static_cast

Но я не знаю, какой из них является истинным. Возможно, оба они являются ложными. 😅

Комментарии:

1. Я сильно сомневаюсь, что эта вещь войдет в стандарт, по крайней мере, не с таким именем. Приведения никогда не являются неявными. Приведение — это то, что вы пишете в своем исходном коде, чтобы сообщить компилятору выполнить преобразование. Преобразования могут быть неявными или явными.

Ответ №1:

Но зачем использовать implicit_cast<size_t>(int) вместо static_cast<size_t>(int) ?

По той же причине, что и в случае класса. В общем, причина та же, почему не рекомендуется использовать приведение в стиле C: предпочитайте использовать приведение, которое допускает минимальный набор приведений, содержащий нужное приведение, чтобы вы случайно не выполнили приведение, которое вам не нужно.

Комментарии:

1. Спасибо за ответ, но я не могу понять вашу точку зрения. Было бы лучше, если бы вы могли привести мне пример 😅 .