const int [2]是否可以轻易复制?

时间:2013-10-22 19:23:32

标签: c++ visual-studio-2012 c++11 visual-studio-2013 static-assert

我有一个模板化的成员函数,看起来有点像:

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 report

2 个答案:

答案 0 :(得分:1)

3.9[basic.types]/9

  

标量类型,简单的可复制类类型(第9节),此类型的数组以及这些类型的cv限定版本(3.9.3)统称为普通可复制类型

您的案例是标量类型的cv限定版本数组。

答案 1 :(得分:0)

  

TriviallyCopiable对象的标量类型和数组是   TriviallyCopiable也是如此。 [1]

gcc reports it也是可以复制的。这似乎是VS2013中的一个错误。