2012-08-15 27 views
10

¿Proporciona C++ 11 alguna garantía sobre las funciones o métodos inline, cuando realizan llamadas a otras funciones declaradas con el calificador noexcept?C++ 11 calificador noexcept y métodos en línea

class My_String { ... 

    const char * c_str() const noexcept; 
    inline operator const char *() const { return c_str(); } 
}; 

que asumen un compilador de optimización sería libre de aplicar el método en línea sin plena EH y la pila de desenrollado, según el noexcept calificación. También esperaría esto por un simple método de acceso también:

... inline operator const char *() const { return m_buffer; } 

Aunque este ejemplo se ve trivial, a excepción garantiza importa cuando se utiliza para implementar otras clases o funciones. Q: ¿El estándar C++ 11 aborda esto o los métodos en línea deben marcarse noexcept? ¿O es mejor omitir noexcept a menos que requiera para que coincida con una especificación de clase o función?

Edit: Para evitar algunas confusiones: ¿Está implícito noexcept para el método en línea?

+1

Para el código proporcionado por el usuario, 'noexcept' solo está implícito en los destructores, como una respuesta simple. –

+2

una pregunta de seguimiento es: ** ¿debería uno declarar 'noexcept' siempre que sea posible? ** – Walter

Respuesta

8

Lo siento, no. Las únicas excepciones implícitas son

  • En destructores.
  • En otras funciones miembro explícitamente predeterminadas o implícitamente predeterminadas: constructores predeterminados, copia y mueve constructores, y copia y mueve la asignación, cuando no se declara en una definición de clase, o se declara con = default;.
  • En funciones de desasignación: operator delete y operator delete[].

Por lo tanto, con cualquier declaración de ejemplo, noexcept(static_cast<const char*>(std::declval<const MyString>())) debe ser false. Continúa y escribe noexcept donde podría importar.

Por supuesto, como ha observado, una optimización del compilador todavía puede notar que una función en línea no puede generar excepciones y simplificar el manejo de excepciones en la persona que llama.

+1

En la lista de * implícito' noexcept' *, falta que los destructores que se usan declarados/definidos sean implícitamente 'noexcept' a menos que el el usuario proporcionó una especificación de excepción diferente. Esta es una desviación de C++ 11 del comportamiento de C++ 03. Es decir, un destructor declarado por el usuario como 'T :: ~ T() {throw 1; } 'terminará el programa, incluso si no hay otra excepción activa (tenga en cuenta la falta de especificación de excepción) –

+0

Me perdí eso al escanear el estándar, gracias. – aschepler

+1

También se perdió en la respuesta original: los miembros especiales explícitamente predeterminados actúan igual que si se declara implícitamente. – aschepler

Cuestiones relacionadas