2

次のようなテンプレート化されたメンバー関数があります。

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 レポートはこちら

4

2 に答える 2

2

3.9[basic.types]/9言う

スカラー型、自明にコピー可能なクラス型 (条項 9)、そのような型の配列、およびこれらの型の cv 修飾バージョン (3.9.3) は、自明にコピー可能な型と総称されます。

あなたのケースは、スカラー型の cv 修飾バージョンの配列です。

于 2013-10-22T19:44:21.180 に答える
0

はい。

TriviallyCopiable オブジェクトのスカラー型と配列も TriviallyCopiable です。[1]

また、gccは自明にコピー可能であると報告します。VS2013のバグのようです。

于 2013-10-22T19:49:02.630 に答える