【发布时间】:2013-06-08 22:34:44
【问题描述】:
我正在尝试理解代码:
#include <iostream>
#include <stdexcept>
// constexpr functions use recursion rather than iteration
constexpr int factorial(int n)
{
return n <= 1 ? 1 : (n * factorial(n-1));
}
// literal class
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 functions signal errors by throwing exceptions from operator ?:
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 << "4! = " ;
constN<factorial(4)> out1; // computed at compile time
volatile int k = 8; // disallow optimization using volatile
std::cout << k << "! = " << factorial(k) << '\n'; // computed at run time
std::cout << "Number of lowercase letters in \"Hello, world!\" is ";
constN<countlower("Hello, world!")> out2; // implicitly converted to conststr
}
参数是什么
const char(&a)[N]
?我不明白.. 似乎是对数组的引用.. 将它传递给 constexpr 构造函数有什么意义?
【问题讨论】:
-
是的,它是对固定大小数组的引用。并且因为它的大小是由模板定义的,所以它具有为您可能传递的每个数组大小定义一个 (constexpr) 构造函数的结果(最终结果
sz设置为您传递的数组的常量大小)。所以这很好,但我不确定constexpr对于构造函数是否真的有效。 -
好的,一些快速搜索告诉我
constexpr构造函数确实有效。实际上,它们允许在编译时调用构造函数,只留下行为类似于thing a={0,1,2}的东西,就像你所期望的那样。