Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ constexpr类和模板函数匹配_C++_Templates_C++11_Constexpr - Fatal编程技术网

C++ constexpr类和模板函数匹配

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

我正在试用constexpr来了解功能,我认为它可以使模板元编程更容易一些(如果我理解正确的话)

我有一个虚拟示例,其中一个类有一个const number字段,并且标记为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;
}
#包括
类常量
{
公众:
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()
在编译时没有像您预期的那样进行计算