如果我的班级是字面的班级,那么将我的类的对象声明为constexpr是多余的
If my class is a literal class then is it redundant to declare an object of my class as constexpr?
我有一个constexpr类调试:
struct Debug {
constexpr Debug(bool a, bool b, bool c) : a(a), b(b), c(c) {}
bool a, b, c;
constexpr bool get() const { return a; }
};
int main() {
Debug dbg(true, false, false); // is dbg constexpr object?
constexpr Debug dbg2(0, 0, 0); // is constexpr redundant here?
}
您可以看到 dbg
是一个constexpr对象,因为它是使用constexpr构造函数初始化的,因此,如果我通过constexpr限定了它,这有什么意义?
- 我不知道
dbg
和dbg2
之间的区别。谢谢。
有一个主要区别:只能在需要常数表达式的情况下使用dbg2
。例如,考虑允许任意非类型模板参数的即将到来的C 20功能:
template <Debug> void f() { }
使用上述定义,f<dgb2>()
将编译,而f<dgb>()
则不会。
f<dgb>();
<source>:7:29: note: template argument deduction/substitution failed: <source>:13:12: error: the value of 'dbg' is not usable in a constant expression 13 | foo<dbg>(); // ERROR | ^ <source>:10:9: note: 'dbg' was not declared 'constexpr' 10 | Debug dbg(true, false, false); // is dbg constexpr object?
godbolt.org上的实时示例
这在C 11中也很重要。您将能够说:
template <bool> void g() { }
g<dgb2.a>();
但不是:
g<dgb.a>();
godbolt.org上的实时示例
两个变量如何不同的简单证明:
struct Debug {
constexpr Debug(bool a, bool b, bool c) : a(a), b(b), c(c) {}
bool a, b, c;
constexpr bool get() const { return a; }
};
int main() {
Debug dbg(true, false, false); // dbg is not a constant
constexpr Debug dbg2(0, 0, 0); // constexpr makes this a constant expression
// *** Begin demo ***
dbg.a = false;
//dbg2.a = false; //< error: assignment of member 'Debug::a' in read-only object
// *** End demo ***
}
可以更改dbg
的值,而dbg2
的值不能。
要获得一个恒定表达式的Debug
对象,您同时需要构造函数中的constexpr
限定符(以将Debug
对象标记为恒定表达式(和 constexpr
fififier在变量声明中(以标记该对象标记该对象作为恒定表达式(。
相关文章:
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 我应该声明所有不抛出 noexexcept 的成员/函数吗?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 我的代码中有错误,未声明的标识符
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 为什么我的对象声明不调用默认构造函数?
- 我的函数调用 (C++) 中的未声明标识符
- 函数指针给我"重新声明为不同类型的符号"错误
- 我应该声明我的函数模板专业化还是定义它们就足够了
- 我需要声明一个包含整数向量的 4x4 矩阵
- 为什么我的.cpp文件无法解析 .h 文件中声明的变量?
- 为什么我在声明的函数上收到链接错误
- 如果我的班级是字面的班级,那么将我的类的对象声明为constexpr是多余的
- 为什么我不能在类中另一个函数的声明中使用静态 constexpr 的结果?
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- 我的Qt程序可以编译,但是当我在声明中使用ifstream时崩溃
- 我必须声明自己的 wxFrame 类吗?
- 这是C++模板声明真的不正确还是我的编译器搞砸了
- 我的声明是无限的循环
- 带有容器和默认分配器的模板模板参数:我可以让我的声明更紧凑吗