constexpr修饰符

常量表达式

如果在编译阶段就能知道确切值,就是常量表达式,一部分const语句是,不是全部。

const int ci = 42;   //是
const int ci2 = ci+1; //是

int j = 1;   //不是,就不是一个常量
const int size = getSize();  //不是,运行时期才能确定

constexpr

1.作用

验证是否是常量表达式,不是就报错

#include <iostream>
using namespace std;

const int getSize()
{
    return 0;
}
int main() {
   constexpr int ci = 42;   //是
   constexpr int ci2 = ci+1; //是

   int j = 1;   //不是,就不是一个常量
   constexpr int size = getSize();  //xxx,报错

    return 0;
}

字面值类型

1.如何判断

可以和constexpr结合的都是,算数类型,指针和引用是,自定义类不是

2.修饰指针和引用

指向的对象必须具有固定地址,就是编译时就确定地址,普通的局部变量不行,static还行

constexpr和指针

修饰的是指针本身,位置就只能放最前面

constexpr int* constexpr p2 = nullptr;  //xxx,错了,不认可那个位置

 

一个有意思的对比

只能放外面才是常量表达式

#include <iostream>
using namespace std;

const int i =42;   //放这里q那句才对
int main() {
    constexpr int* p2 = nullptr;
    
    constexpr const int *q = &i;
    
    return 0;
}

放main里面,constexpr指针不认。'& i' is not a constant expression。

#include <iostream>
using namespace std;


int main() {
    constexpr int* p2 = nullptr;

    const int i =42;    //这里i是局部变量,编译期地址不定
    constexpr const int *q = &i;  //xxx,不认可&i是常量表达式

    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++11中引入了`constexpr`关键字,用于修饰函数、变量等,以在编译时求值并在运行时具有常量表达式的性质。如果一个函数被声明为`constexpr`,它的返回值可以在编译时求值,而不仅仅在运行时。 要将函数的返回值声明为`constexpr`,需要满足以下条件: 1. 函数体内只能包含能够在编译时求值的语句。 2. 函数的参数和局部变量必须是字面类型(literal type)。 3. 函数体内不能包含分支语句(例如`if`、`switch`)或循环语句(例如`for`、`while`)。 4. 函数体内不能调用非`constexpr`函数。 以下是一个示例,演示如何使用`constexpr`修饰函数的返回值: ```cpp constexpr int square(int x) { return x * x; } int main() { constexpr int result = square(5); // 在编译时求值 static_assert(result == 25, "Error: result is not 25."); // 静态断言 return 0; } ``` 在上面的示例中,函数`square`被声明为`constexpr`,它接受一个整数参数并返回该参数的平方。在`main`函数中,我们使用`constexpr`修饰符调用了`square`函数,并将结果赋值给了一个`constexpr`变量`result`。由于`square`函数可以在编译时求值,所以编译器能够在编译期间计算出`result`的值为25。我们还使用了静态断言`static_assert`来验证结果是否为25,如果不是则会在编译时报错。 请注意,`constexpr`修饰符的使用是有限制的,它要求函数满足一些特定的条件。如果函数的实现不满足这些条件,编译器将无法将其求值为常量表达式,并且不能将其声明为`constexpr`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值