Информация об изменениях

Сообщение Re[2]: А идет ли развитие в области альтернатив исключениям? от 27.03.2016 5:01

Изменено 27.03.2016 5:03 uncommon

Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Есть некий симбиоз возвращаемых значений и исключений — expected<T>


Товарищ Александреску опять по своему обыкновению придумал фигню, которую никто никогда не будет использовать. Даже он сам. Expected<T> завязан на make_exception_ptr:

// Building from exception
// © 2012- Andrei Alexandrescu. Do not redistribute. 23 / 54
template
<class E>
static Expected<T> fromException(const E& exception) {
  if (typeid(exception) != typeid(E)) {
    throw std::invalid_argument( "slicing detected");
  }
  return fromException(std::make_exception_ptr(exception));
}


А make_exception_ptr как реализован?

166│   /// Obtain an exception_ptr pointing to a copy of the supplied object.
167│   template<typename _Ex>
168│     exception_ptr
169│     make_exception_ptr(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
170│     {
171│ #if __cpp_exceptions
172│       try
173│         {
174├>          throw __ex;
175│         }
176│       catch(...)
177│         {
178│           return current_exception();
179│         }
180│ #else
181│       return exception_ptr();
182│ #endif
183│     }


То бишь, проще и более эффективно, просто сразу выбросить исключение и не заморачиваться с Expected<T>, который внутри себя бросает, а потом ловит исключение, с одной единственной целью, как он сам говорит: избежать выброса исключения, потому что это очень дорогая операция.
Re[2]: А идет ли развитие в области альтернатив исключениям?
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Есть некий симбиоз возвращаемых значений и исключений — expected&lt;T&gt;


Товарищ Александреску опять по своему обыкновению придумал фигню, которую никто никогда не будет использовать. Даже он сам. Expected<T> завязан на make_exception_ptr:

// Building from exception
// © 2012- Andrei Alexandrescu. Do not redistribute. 23 / 54
template
<class E>
static Expected<T> fromException(const E& exception) {
  if (typeid(exception) != typeid(E)) {
    throw std::invalid_argument( "slicing detected");
  }
  return fromException(std::make_exception_ptr(exception));
}


А make_exception_ptr как реализован?

166│   /// Obtain an exception_ptr pointing to a copy of the supplied object.
167│   template<typename _Ex>
168│     exception_ptr
169│     make_exception_ptr(_Ex __ex) _GLIBCXX_USE_NOEXCEPT
170│     {
171│ #if __cpp_exceptions
172│       try
173│         {
174├>          throw __ex;
175│         }
176│       catch(...)
177│         {
178│           return current_exception();
179│         }
180│ #else
181│       return exception_ptr();
182│ #endif
183│     }


То бишь, проще и более эффективно просто сразу выбросить исключение и не заморачиваться с Expected<T>, который внутри себя бросает, а потом ловит исключение, с одной единственной целью, как он сам говорит: избежать выброса исключения, потому что это очень дорогая операция.