unidimensionales tridimensionales programas matrices bidimensionales arreglos c++ swap noexcept

c++ - tridimensionales - ¿Por qué el intercambio de matrices multidimensionales no es noexcept?



matrices en c (1)

Esta sobrecarga:

template<class T, size_t N> void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));

no está en alcance hasta ; , por lo que swap(*a, *b) no considera esta sobrecarga. Esto se debe a:

3.3.2 / 1 El punto de declaración para un nombre es inmediatamente después de su declarador completo (Cláusula 8) y antes de su inicializador (si lo hubiera) ...

y la especificación de excepción es parte del declarador.

Tengo el siguiente fragmento de código:

#include <algorithm> #include <iostream> int main(int argc, char** argv) { int x[2][3]; int y[2][3]; using std::swap; std::cout << noexcept(swap(x, y)) << "/n"; return 0; }

Usando GCC 4.9.0, esto imprime 0 . No entiendo porque

De acuerdo con el estándar, hay dos sobrecargas para std::swap :

namespace std { template<class T> void swap(T& a, T& b) noexcept( is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value ); template<class T, size_t N> void swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b))); }

En mi entendimiento, el especificador noexcept para la matriz debería funcionar recursivamente para matrices multidimensionales.

¿Por qué el intercambio de matrices multidimensionales no es noexcept ?

Mientras intentaba encontrar un ejemplo mínimo que todavía se comporta de manera extraña, se me ocurrió lo siguiente:

#include <iostream> template<class T> struct Specialized : std::false_type {}; template<> struct Specialized<int> : std::true_type {}; template<class T> void f(T& a) noexcept(Specialized<T>::value); template<class T, std::size_t N> void f(T (&a)[N]) noexcept(noexcept(f(*a))); int main(int argc, char** argv) { int x, y[1], z[1][1]; std::cout << noexcept(f(x)) << " " << noexcept(f(y)) << " " << noexcept(f(z)) << "/n"; }

Usando GCC 4.9.0, esto imprime 1 1 0 , pero nuevamente no entiendo por qué.