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)
您可以使用以下其中一项:
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)
最简洁和惯用的?我会说取第一个元素的地址
foo(&x[0]);
Run Code Online (Sandbox Code Playgroud)
从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]
从c ++ 14开始,在这方面有更明确的功能:std::decay