明确将数组衰减为指针的最简洁和惯用的方式是什么?
例如,考虑一下您需要能够指导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);
答案 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]
自c ++ 14 以来,有更明确的功能:std::decay
答案 2 :(得分:2)
股票&x[0]
总是让我感到尴尬,因为有问题的数组可能是一个不完整类型的数组,将一个下标运算符应用于一个数组当然是无效的。请考虑一下,
foo(&*x);
这只是要输入的字符,而不是foo(+x)
,它的可读性和难度都要低得多。