我正在尝试使用constexpr来感受功能,我发现它可以使模板元编程更容易(如果我理解正确的话)。
我有一个虚拟的例子,其中一个类有一个const数字字段,而被标记为constexpr的ctor应该表现得像一个编译时常量。它有哪些功能,但有些功能与模板功能匹配失败:
#include <iostream>
class ConstNum
{
public:
constexpr ConstNum(int num) : _num(num)
{
}
constexpr int number() const
{
return _num;
}
private:
const int _num;
};
template<class T, size_t N>
constexpr int num_elements(const T (&arr) [N])
{
return N;
}
int main()
{
ConstNum c1(3);
char arr[c1.number()];
// fails to compile here with error message:
// No matching function for call to num_elements
//
std::cout << num_elements(arr) << std::endl;
return 0;
}
我在XCode上运行,错误消息提供了有关此内容的详细信息 语义问题:附加文本:
如果我将c1.number()替换为3,则编译正常。 或者如果我完全删除了std :: cout调用,那么编译就可以了。
任何想法我在这里缺少什么。 谢谢
萨朗
答案 0 :(得分:3)
即使标记为constexpr
的函数可能在运行时进行评估。如果需要编译时评估,则应将constexpr
说明符添加到c1
对象,否则将在运行时构建:
constexpr ConstNum c1(3);
输出:
> ./main
3
提示:已启用警告的Clang为您的代码提供以下输出:
main.cpp:29:13: warning: variable length arrays are a C99 feature [-Wvla-extension]
char arr[c1.number()];
这意味着,c1.number()
未在编译时评估,正如您所期望的那样