Constexpr类和模板函数匹配

constexpr class and template function match

本文关键字:函数 Constexpr      更新时间:2023-10-16

我正在尝试constexpr来获得功能的感觉,我看到它可以使模板元编程更容易一点(如果我理解正确的话)。

我有这个虚拟的例子,其中一个类有一个const number字段,并且标记为constexpr的tor应该表现得像编译时常数。它确实这样做,但在模板函数匹配时却失败了:

#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上运行,错误信息给出了关于这个存在的详细信息语义问题:附加文本为:

  1. 候选模板被忽略:无法匹配'const T[N]'"char [c1.number ()

如果我将c1.number()替换为3,则编译良好。或者,如果我完全删除std::cout调用,这将编译得很好。

知道我在这里错过了什么吗?谢谢你

Sarang

即使函数标记为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(),正如您所期望的那样