次のようなテンプレート化されたメンバー関数があります。
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
...
}
次に、次のような方法でこの関数を呼び出します。
const int iArray[2] = {1, 2};
int iResult = pSocket->SendData( iArray );
これを Visual Studio 2012 でコンパイルすると、エラー メッセージは表示されず、プログラムの機能は想定どおり (つまり、データがビットごとに送信される) ですが、コンパイラの最新バージョンである Visual Studio 2013 でコンパイルすると、静的アサートは失敗し、コンパイラは次のステートメントを発行します。
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> ]
では、コンパイラのどのバージョンが標準に準拠しているかconst int[2]
、簡単にコピーできるかどうかは?
編集: これは Visual Studio 2013 のバグです。Microsoft Connect レポートはこちら