C++ constexpr类和模板函数匹配
我正在试用constexpr来了解功能,我认为它可以使模板元编程更容易一些(如果我理解正确的话) 我有一个虚拟示例,其中一个类有一个const number字段,并且标记为constexpr的ctor的行为应该类似于编译时常量。它会这样做,但模板函数匹配会失败:C++ constexpr类和模板函数匹配,c++,templates,c++11,constexpr,C++,Templates,C++11,Constexpr,我正在试用constexpr来了解功能,我认为它可以使模板元编程更容易一些(如果我理解正确的话) 我有一个虚拟示例,其中一个类有一个const number字段,并且标记为constexpr的ctor的行为应该类似于编译时常量。它会这样做,但模板函数匹配会失败: #include <iostream> class ConstNum { public: constexpr ConstNum(int num) : _num(num) { } const
#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;
}
#包括
类常量
{
公众:
constexpr ConstNum(int num):\u num(num)
{
}
constexpr int number()常量
{
返回_num;
}
私人:
const int_num;
};
模板
constexpr int num_元素(const T(&arr)[N])
{
返回N;
}
int main()
{
常数c1(3);
字符arr[c1.number()];
//无法在此编译,并显示错误消息:
//对num_元素的调用没有匹配的函数
//
std::cout即使标记为constexpr
的函数也可能在运行时求值。如果要在编译时求值,应向c1
对象添加constexpr
说明符,否则将在运行时构造:
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()
在编译时没有像您预期的那样进行计算