gcc - gcc 中有一种方法可以在编译时无法评估 constexpr 时收到警告吗?

标签 gcc g++ c++14 constexpr

我正在使用 gcc 5.1.0 (c++14) 并且我正在尝试使用 constexpr。验证我实现的 constexpr 是否在编译时进行评估是非常烦人的。我找不到任何标志来获得有关这种情况的警告。

这是一个例子: 示例.cpp -----------------------------------------------------

#include <stdlib.h>

const char pruVar[] = "12345678901234567";


[[gnu::noinline]] constexpr unsigned int myStrlen(const char* cstr)
{
    unsigned int i=0;
    for(;cstr[i]!=0;++i);
    return i; 
}

struct CEXAMPLE
{
    unsigned int size;
    constexpr CEXAMPLE(const char* s): size(myStrlen(s))
    {
    }
};

int main(void)
{
    CEXAMPLE c(pruVar);
    unsigned int size = myStrlen(pruVar);
    void* a = malloc(c.size + size);
    if (a != nullptr)
        return 0;
    else
        return 1;
}

在示例中,CEXAMPLE::CEXAMPLE 在编译时计算,包括对 myStrlen 的调用,但 main 中对 myStrlen 的调用是在运行时计算的。我知道这一点的唯一方法是查看汇编程序。这个网站也非常有用:http://gcc.godbolt.org/

如果您知道如何让编译器对此或类似的情况发出警告,我将不胜感激

最佳答案

myStrlen(pruVar) 可以在编译时求值;在这种情况下,编译器只是选择不这样做。

如果您想强制编译器在编译时计算它,或者在不可能的情况下出错,请将结果分配给 constexpr 变量:

constexpr unsigned int size = myStrlen(pruVar);
^^^^^^^^^

您还可以使用enumstd::integral_constant:

enum : unsigned int { size = myStrlen(pruVar) };
std::integral_constant<unsigned int, myStrlen(pruVar)> size;

关于gcc - gcc 中有一种方法可以在编译时无法评估 constexpr 时收到警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30731953/

相关文章:

c++ - 类数据成员中可以使用模板参数推导吗?

c - GCC 链接时间错误 - 没有规则可以制定目标

c++ - g++ std::visit 泄漏到全局命名空间?

c - 使用 arm-none-eabi 工具链时重新定义 fputc 函数

操作数后应有逗号、冒号、修饰符或行尾

c++ - g++ 将库附加到应用程序

c++ - 在 C++14 中使用 delete 防止调用无效值

c++ - 聚合初始化原子成员

c++ - 为什么我转发到单独命名空间中的 std::make_pair 不明确?

c - GDB [[Inferior 1 (process 2710) exited with code 06]] 奇怪的输出