constexpr类和模板函数匹配

时间:2014-07-03 05:57:10

标签: c++ templates c++11 constexpr

我正在尝试使用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上运行,错误消息提供了有关此内容的详细信息 语义问题:附加文本:

  1. 忽略了候选模板:无法匹配&#39; const T [N]&#39;反对 &#39; char [c1.number()]
  2. 如果我将c1.number()替换为3,则编译正常。 或者如果我完全删除了std :: cout调用,那么编译就可以了。

    任何想法我在这里缺少什么。 谢谢

    萨朗

1 个答案:

答案 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()未在编译时评估,正如您所期望的那样