将数组显式衰减为指针

moc*_*ace 10 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);
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 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
Run Code Online (Sandbox Code Playgroud)


Nik*_*iou 5

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

foo(&x[0]);
Run Code Online (Sandbox Code Playgroud)

UPDATE

从c ++ 11开始,有一种标准的说法:

auto a = std::addressof(x[0]); // a will be * to int
Run Code Online (Sandbox Code Playgroud)

adressof 有以下签名

template<class T> T* addressof(T& arg);
Run Code Online (Sandbox Code Playgroud)

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

另一个想法(也有上述优点)就是写作

auto a = std::begin(x); // a will be * to int
Run Code Online (Sandbox Code Playgroud)

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

更新2

从c ++ 14开始,在这方面有更明确的功能:std::decay

  • 为什么不呢?&*c`呢? (3认同)