【发布时间】:2020-04-20 21:40:17
【问题描述】:
按照 Scott Meyer 的“现代 C++”中的一个示例,我将利用模板来利用 std::array 大小推导。我在尝试编译我的 myUsage 函数用法时偶然发现。
#include <array>
#include <iostream>
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&) [N]) noexcept
{
return N;
}
void scottUsage()
{
int b[5];
std::array<short, arraySize(b)> c;
std::cout << arraySize(b) << " = " << c.size() << "\n";
}
template <typename T, std::size_t N>
void myUsage(T & arr [N])
{
for (auto i=0; i<arraySize(arr); i++)
std::cout << arr[i] << "\t";
}
int main()
{
scottUsage();
int a[7];
myUsage(a);
}
所以出现了两个问题:
- (附带问题)
(&)是干什么用的?删除会触发error: creating array of references,这似乎是被禁止的 -
myUsage签名有什么问题?
【问题讨论】:
-
不应该是
myUsage(T (&arr) [N])吗?括号对于使其成为对数组的引用(而不是引用数组)很重要。 -
当然,谢谢你们。请提供 cmets 作为答案(可能对
(&varname)不常见语法的解释很少,我很乐意标记为已解决 -
另外,
main()中的a是一个未初始化的int数组。打印myUsage()中的元素——一旦你用参数修正了拼写错误——因此会导致未定义的行为。 -
真的是彼得?我以为我只是在阅读垃圾数据。无论如何,例如清酒
-
@PatrizioBertoni 最好让示例尽可能简单,以免意外引入与您的问题无关的错误。换句话说,示例应该最少。见minimal reproducible example。
标签: c++ arrays c++11 templates stl