【发布时间】:2014-07-03 05:57:10
【问题描述】:
我正在尝试 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 上运行,错误消息提供了有关此的详细信息 语义问题:附加文本是:
- 候选模板被忽略:无法匹配“const T[N]” 'char [c1.number()]
如果我将 c1.number() 替换为 3,则编译得很好。 或者如果我完全删除 std::cout 调用,这编译得很好。
任何想法我在这里缺少什么。 谢谢
萨朗
【问题讨论】:
标签: c++ templates c++11 constexpr