c++ - 使用 constexpr 时出现编译错误

标签 c++ c++11 constexpr

#include <stdio.h>
#include <iostream>

using namespace std;

template <typename T, int N>
int ReturnArraySize(T (&arg1)[N]) {
    return N;
}

constexpr int ReturnTheSum(int arg1, int arg2) {
    return arg1 + arg2;
}

int main(int argc, char **argv)
{
    int arr1[20];
    int arr2[ReturnArraySize(arr1)];
    int arr3[ReturnTheSum(ReturnArraySize(arr1), ReturnArraySize(arr2))];

    return 0;
}

当我编译代码时,出现以下错误:

/root/Documents/C++11_Fundamentals/ConstExprRelatedFunc/main.cpp:19:67: error: no matching function for call to 'ReturnArraySize(int [(<anonymous> + 1)])'

最佳答案

因为 ReturnArraySize 没有被标记为 constexpr 函数,arr2 变成了一个 VLA( variable-length array ,一个 GCC 扩展,不是C++ 标准),无法在编译时查询其大小(即,由函数模板推导)。

您可以通过将 ReturnArraySize 设为 constexpr 来解决此问题:

template <typename T, int N>
constexpr int ReturnArraySize(T (&arg1)[N]) {
//~~~~~~^
    return N;
}

关于c++ - 使用 constexpr 时出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36337797/

相关文章:

c++ - 为什么缺少不足的 block 时,读取系统调用会停止读取?

c++ - 在 C++ 11 中使用 initializer_list 初始化 unique_ptr

c++ - 检索类内初始化成员的默认值

python - pybind11:将 c++ 类(具有现有的 python 绑定(bind))返回给 python

c++ - 使用 constexpr 时的 Intel 编译器和 "cannot have an in-class initializer"

c++ - 将 Python 持久层嵌入到 C++ 应用程序中——好主意吗?

c++ - 使用 DXGI 将一台显示器切换到全屏时,其他显示器会变黑

c++ - DWORD 中的包装值

C++ constexpr指针和constexpr比较

c++ - 为什么在运行时而不是在编译时使用 constexpr 初始化变量