如果我将类声明为const而不是constexpr,则程序不起作用?

时间:2015-04-03 13:46:03

标签: 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;
}

1 个答案:

答案 0 :(得分:4)

应用于函数的

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

因此x.any()仅在xconstexpr时才是常量表达式。如果它只是const,则x.any()不是常量表达式。