在这个site上,他们给出了一个文字类的例子:
#include <iostream>
#include <stdexcept>
class conststr
{
const char* p;
std::size_t sz;
public:
template<std::size_t N>
constexpr conststr(const char(&a)[N]) : p(a), sz(N - 1) {}
constexpr char operator[](std::size_t n) const
{
return n < sz ? p[n] : throw std::out_of_range("");
}
constexpr std::size_t size() const { return sz; }
};
constexpr std::size_t countlower(conststr s, std::size_t n = 0,
std::size_t c = 0)
{
return n == s.size() ? c :
s[n] >= 'a' && s[n] <= 'z' ? countlower(s, n + 1, c + 1) :
countlower(s, n + 1, c);
}
// output function that requires a compile-time constant, for testing
template<int n>
struct constN
{
constN() { std::cout << n << '\n'; }
};
int main()
{
std::cout << "the number of lowercase letters in \"Hello, world!\" is ";
constN<countlower("Hello, world!")>(); // implicitly converted to conststr
}
程序产生输出
the number of lowercase letters in "Hello, world!" is 9
但我不明白这个计划的一部分。也就是说,这一行:
constexpr conststr(const char(&a)[N]) : p(a), sz(N - 1) {}
const char(&a)[N]
,这个语法究竟意味着什么?它有名字吗?
答案 0 :(得分:4)
代码const char(&a)[N]
需要括号说“a
是对N
const char
s数组的引用。
如果没有括号,您将拥有const char &a[N]
- “a
是一个N
const char
引用数组”,这是不允许的。< / p>
这就是为什么我更喜欢typedef
,以使这些事情变得更加清晰:
typedef const char ArrayN[N];
ArrayN &a;