将数组显式衰减为指针

时间:2014-04-11 12:05:07

标签: c++ arrays pointers c++11

明确将数组衰减为指针的最简洁和惯用的方式是什么?


例如,考虑一下您需要能够指导SFINAE或明确指出过载的情况:

template<typename T, std::size_t N> void foo(T(&x)[N]);
template<typename T>                void foo(T *x); 
//
int x[2] = {0, 1};
foo(x);

3 个答案:

答案 0 :(得分:8)

您可以使用以下其中一项:

foo(x + 0);
foo(+x);
foo(&x[0]); // assuming operator& has not been overloaded for T
foo(std::addressof(x[0])); // since C++11

答案 1 :(得分:5)

最简洁和惯用?我会说取第一个元素的地址

foo(&x[0]);

更新

从c ++ 11开始,有standard way的说法如上所述:

auto a = std::addressof(x[0]); // a will be * to int

adressof具有以下签名

template<class T> T* addressof(T& arg);

并获得对象或函数arg的实际地址,即使存在重载的运算符&amp;

另一个想法(也具有上述优点)将是写

auto a = std::begin(x); // a will be * to int

此外,这适用于不完整类型的数组,因为它不需要应用[0]

更新2

自c ++ 14 以来,有更明确的功能:std::decay

答案 2 :(得分:2)

股票&x[0]总是让我感到尴尬,因为有问题的数组可能是一个不完整类型的数组,将一个下标运算符应用于一个数组当然是无效的。请考虑一下,

foo(&*x);

这只是要输入的字符,而不是foo(+x),它的可读性和难度都要低得多。