在boost::array中看到这样的代码:
template <typename T, std::size_t N>
T(&get_c_array(boost::array<T,N>& arg))[N]
{
return arg.elems;
}
// Const version.
template <typename T, std::size_t N>
const T(&get_c_array(const boost::array<T,N>& arg))[N]
{
return arg.elems;
}
get_c_array是boost里面自由函数,意在返回boost::array中存储的数组的
引用。
函数返回数组引用的签名如下(注意特别的&符号)
T (&func(...))[N]
这个签名来源于数组引用的签名: T (&arrayR)[N]。
我们很熟悉数组指针的声明方式:T (*arrayP)[N]。
测试程序:
template <int N>
int (*return_arrayP())[N]
{
static int array[] = {2, 3, 4};
return &array;
}
template <int N>
int (&return_arrayR())[N]
{
static int array[] = {2, 3, 4};
return array;
}
int main()
{
static const int N = 3;
// test return pointer to array
std::cout << "test return pointer to array\n";
int (*arrayP)[N] = return_arrayP<N>();
for (int i = 0; i < N; i++) {
std::cout << (*arrayP)[i] << ", ";
}
std::cout << "\n";
// test return reference to array
std::cout << "test return reference to array\n";
int (&arrayR)[N] = return_arrayR<N>();
for (int i = 0; i < N; i++) {
std::cout << arrayR[i] << ", ";
}
std::cout << "\n";
// boost::array return reference to array
// to downcast to T*
std::cout << "use boost::array to return reference to array, and then downcast to T*\n";
int* arrayb = NULL;
boost::array<int, N> oneArray = {1, 2, 3};
arrayb = boost::get_c_array(oneArray);
for (int i = 0; i < N; i++) {
std::cout << arrayb[i] << ", ";
}
std::cout << "\n";