2011-04-22 12 views
14

Al ir a través de las últimas ediciones del proyecto de C++ 0x Trabajo me encontré con un montón de"noexcept" vs "Lanza: nada"

  • eliminación de la palabra clave noexcept
  • adición de Pruebas Lanzamientos: nada en el mismo lugar

y viceversa. Sólo algunos ejemplos:

  • reemplazo de noexcept contra Lanza: nada: seguridad 20.6.4 puntero [util.dynamic.safety]template<class T> T*undeclare_reachable(T*p);
  • adición de noexcept: 20.6.3.2. Puntero rasgos funciones miembro [pointer.traits.functions]: static pointer pointer_trait<T*>::pointer_to(...) noexcept;

preguntas aquí:

  • ¿Hay una regla/patrón general, cuando nos encontremos frente a noexceptLanza: nada en el Std-Lib?
  • ¿Deberían los usuarios derivar un comportamiento específico según esa regla dada? Es decir. cuando ellos deberían o no deberían agregar noexcept a sus propias funciones?

Respuesta

16

En Madrid fueron fuertemente influenciados por N3279 que incluye las siguientes directrices:

Adoptado Directrices

  • Ninguna biblioteca destructor debe lanzar. Utilizarán la especificación de excepción suministrada implícitamente (sin tirar).

  • Cada función de biblioteca que tiene un contrato amplio, que el LWG está de acuerdo en que no puede lanzar, debe marcarse incondicionalmente como noexcept.

  • Si una función de intercambio de biblioteca, move-constructor o move-assignment tiene una extensión condicional (es decir, se puede probar que no se aplica aplicando el operador noexcept), se debe marcar como no condicionalmente noexcept. Ninguna otra función debe usar una especificación condicional noexcept.

  • Las funciones de biblioteca diseñadas para la compatibilidad con el código "C" (como la función atómica), se pueden marcar como incondicionalmente noexcept.

No interpreto que estas directrices se dirijan necesariamente a un público más amplio. Esto es principalmente una admisión de que tenemos problemas de compatibilidad con la adición de noexcept. Si lo hacemos mal, no es más fácil agregar que quitar en el siguiente estándar. Entonces intentamos una aplicación de noexcept que fuera a la vez conservadora y sistemática.

+0

Ya veo. Situación difícil.Creo que leeré un poco más en los documentos del WG21 para prepararme para preguntas como * "¿cuándo debería agregar' noexcept' a mis propias funciones? ". * N3279 es un buen punto de entrada. ¿Tienes más? Por ejemplo, actualmente sugiero que 'swap' debe ser' noexcept' en el código de usuario, y se planea seguir la literatura sobre * move-assign *, etc. ¿Los usuarios deberían marcar 'noexcept' o la suposición implícita es suficiente? ¿Podemos esperar que los compiladores obtengan (algún día) algo de eso, de los usuarios? – towi

+0

Actualmente no tengo acceso a un compilador que implemente noexcept. Por lo tanto, no tengo ningún consejo personal sobre el tema (la experimentación es una gran cosa para mí). Puede encontrar todos los documentos del WG21 aquí: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/ –

+0

Gracias, seguiré de cerca las notas del compilador. Sí, ya estoy metido en esos documentos :-) – towi