【问题标题】:constexpr class and template function matchconstexpr 类和模板函数匹配
【发布时间】: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 上运行,错误消息提供了有关此的详细信息 语义问题:附加文本是:

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

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

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

萨朗

【问题讨论】:

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


    【解决方案1】:

    即使函数标记为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() 在编译时没有像您预期的那样被评估

    【讨论】:

      猜你喜欢
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多