c++ visual-studio-2012 c++11 visual-studio-2013 static-assert

c++ lambda capture



¿Es const int[2] trivially copyable? (2)

Sí.

Los tipos y matrices escalares de objetos TriviallyCopiable también son TriviallyCopiable. [1]

También gcc informa que es trivialmente copiable . Parece un error en VS2013.

Tengo una función de miembro con plantilla que se parece a la siguiente:

template <typename T> int SendData( const T& tDataBuffer ) const { static_assert( std::is_trivially_copyable<T>::value, "The object type must be trivially copyable" ); // Send the data bitwise ... }

Luego llamo a esta función de la siguiente manera:

const int iArray[2] = {1, 2}; int iResult = pSocket->SendData( iArray );

Cuando compilo esto con Visual Studio 2012, no aparece ningún mensaje de error y la funcionalidad del programa es la que esperaría (es decir, los datos se envían en modo bit), sin embargo, al compilar con la versión más reciente del compilador, Visual Studio 2013, la afirmación estática falla, el compilador me emite la declaración:

1>c:/.../sockets.h(298): error C2338: The object type must be trivially copyable 1> c:/.../test.cpp(974) : see reference to function template instantiation ''int CBaseSocket::SendData<const int[2]>(T (&)) const'' being compiled 1> with 1> [ 1> T=const int [2] 1> ]

Entonces, ¿qué versión del compilador cumple con los estándares, debe const int[2] ser trivialmente copiable o no?

Editar: Este es un error con Visual Studio 2013; aquí está el informe de Microsoft Connect


3.9[basic.types]/9 dice

Los tipos escalares, los tipos de clase trivially copyable (Cláusula 9), las matrices de dichos tipos, y las versiones de estos tipos calificadas como cv (3.9.3) se denominan colectivamente tipos trivially copyable

Su caso es una matriz de versión cualificada cv de tipo escalar.