c++ constexpr c++17 structured-bindings

c++ - ¿Por qué no pueden las declaraciones de descomposición ser concordantes?



constexpr c++17 (1)

Pregunta: ¿por qué no se permite que las declaraciones de descomposición consten? (aparte de "porque el estándar así lo dice").

No hay otra razon. El estándar dice en [dcl.dcl] p8:

El decl-specifier-seq contendrá solo el type-specifier auto (7.1.7.4) y cv-qualifiers .

Eso significa que no se puede declarar con constexpr .

Este fue el tema de un comentario del Cuerpo Nacional sobre el CD de C ++ 17, ver US-95 en P0488R0 :

Comentario : No hay una razón obvia por la cual las declaraciones de descomposición no puedan declararse como static, thread_local o constexpr.
Cambio propuesto: permita constexpr, static y thread_local al conjunto permitido de especificadores de declinación .

Los comentarios GB 16 y GB 17 también están relacionados.

Estos comentarios fueron rechazados para C ++ 17 después de la revisión por el Grupo de Trabajo de Evolución en la reunión de noviembre de 2016. No estaba claro qué significarían algunas clases de almacenamiento en una declaración de enlace estructurado, y exactamente cómo cambiar la especificación para permitir constexpr (simplemente permitiéndola en la gramática no diría lo que significa). Se solicitó un documento que explorara el espacio de diseño. Debería ser posible cambiar esto en el futuro sin romper ningún código, pero no había tiempo para hacerlo para C ++ 17.

Considere el siguiente fragmento para probar las próximas declaraciones de descomposición de características de C ++ 17 (anteriormente conocidas como enlaces estructurados)

#include <cassert> #include <utility> constexpr auto divmod(int n, int d) { return std::make_pair(n / d, n % d); // in g++7, also just std::pair{n/d, n%d} } int main() { constexpr auto [q, r] = divmod(10, 3); static_assert(q == 3 && r ==1); }

Esto falla tanto en g ++ 7-SVN como en clang-4.0-SVN con el mensaje:

declaración de descomposición no puede ser declarada ''constexpr''

Dejar caer la definición de constexpr y cambiar a una regular assert() funciona en ambos compiladores.

Ninguno de los documentos del WG21 sobre esta característica menciona la palabra clave constexpr , ni en positivo ni negativo.

Pregunta : ¿por qué no se permite que las declaraciones de descomposición constexpr ? (aparte de "porque el estándar así lo dice").