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é.