c++ - 如果我将类声明为 const...而不是 constexpr,程序将无法运行?

标签 c++ class constexpr

这是我的程序:

#include <iostream>

class Debug {
public:
    constexpr Debug(bool h): hw(h){}
    constexpr bool any() { return hw; }
private:
    bool hw;
};

int main(){

    const Debug x(true);

    constexpr bool f = x.any();

}

这会引发错误“‘x’的值在常量表达式中不可用”。如果我更换

const Debug x(true);

constexpr Debug x(true);

然后一切正常。我的印象是将 constexpr 放在对象定义之前与“隐式使该变量成为常量,同时验证它是常量表达式变量”同义。这对我来说表明,在这个程序的情况下,使用“const”而不是“constexpr”应该没有什么不同。事实上,如果有什么地方出错了,它应该将其声明为“constexpr”,而不是“const”。

尽管如此。我不明白 x 为什么不是常量表达式变量。类 Debug 满足文字类类型的标准,x 被声明为 const 并且它使用一个 constexpr 构造函数和一个作为常量表达式的初始化器。

编辑:这个程序引发了同样的错误(诚然,这应该是我原来的程序)。

using namespace std;

class Debug {
public:
    constexpr Debug(bool h): hw(h){}
private:
    bool hw;
};

int main(){
    const Debug x(true);
    constexpr Debug f = x;
}

最佳答案

应用于函数的

constexpr 意味着当且仅当函数的所有输入都是常量表达式时,函数的结果是常量表达式。在成员函数的情况下,输入是参数,以及调用它的对象。

所以只有当xconstexpr 时,x.any() 才是常量表达式。如果它只是 const,则 x.any() 不是常量表达式。

关于c++ - 如果我将类声明为 const...而不是 constexpr,程序将无法运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29433412/

相关文章:

c++ - C++11 统一初始化语法

javascript - 在 javascript 类中混合箭头函数有什么缺点吗?

C++ A星实现--判断节点是否已经在未清项优先队列中

c++ - 在运行的 JVM 中注入(inject) Jar 并替换类

c++ - Arduino Nano - 为什么我的针脚是这样的?

c++ - 重载运算符保持变量更新而不是保持原始变量

c# - C# 中具有零个或多个参数的通用构造函数

c++ - 为什么右值不能分配给 constexpr 引用变量

c++ - const vs constexpr 变量

c++ - 编译器不同意在 constexpr 上下文中使用 std::vector