常量表达式函数

我们可以在函数返回类型前加入关键字constexpr来使其成为常量表达式函数,但并非所有的函数都有资格成为常量表达式函数。事实上,常量表达式函数的要求非常严格,总结如下:

  • 函数体只有单一的return返回语句。
  • 函数必须返回值,不能是void函数。
  • 在使用前必须已有定义。
  • return返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是常量表达式。

由于比较好理解,这里不多做解释,分别举一个例子:

1.函数体只有单一的return返回语句

constexpr int GetConstOne()
{
	int i = 10;	 //违反第一条规则
	return 5;
}

2.函数必须返回值,不能是void函数

constexpr void GetConstTwo() 
{
	//函数必须有返回值,因为无法获得常量的常量表达式是不被认可的
}

3.在使用前必须定义

constexpr int GetConstThree();
int nValue = GetConstThree();                   //没问题,
constexpr int nConstValue = GetConstThree();    //有问题
constexpr int GetConstThree()
{
    return 1;
}

这里我们声明了一个常量表达式函数GetConstThree,在定义函数之前,我们定义了变量nValue和常量表达式nConstValue,在定义nValue时,编译器将GetConstThree()函数转化为一个函数调用,而“函数调用”是指的运行时的过程,这时对于GetConstThree这样的编译时函数已经获得了值,所有所没有问题。而nConstValue要求使用GetConstThree的值,但此值还没有进行编译时计算,所以有问题。

4.return返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是常量表达式。

constexpr int GetConstFour(int x)
{
	x = 1;
	return x;
}

这样做的意义非常明显,即如果我们要使得GetConstFour()成为一个编译时的常量,那么其return表达式语句就不能包含运行时才能确定的变量或函数,只有这样,编译器才能在编译时进行常量表达式函数的额值计算。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++11 引入了 constexpr 关键字,用于指定函数或对象是常量表达式常量表达式是在编译时就能计算出结果的表达式,它可以用于数组大小、模板参数等需要在编译时确定的地方。 constexpr 函数 constexpr 函数是指能在编译时求值的函数,它的返回值可以作为常量表达式使用。constexpr 函数的参数和返回值必须是字面类型。 例如,下面的函数就是一个 constexpr 函数: ```cpp constexpr int square(int x) { return x * x; } ``` 我们可以在编译时计算出 square(5) 的值,因此它是一个常量表达式。 constexpr 对象 constexpr 对象是指在编译时就能计算出值的对象。constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。 例如,下面的语句定义了一个 constexpr 对象: ```cpp constexpr int max_num = 100; ``` 我们可以在编译时就知道 max_num 的值是 100,因此它是一个常量表达式。 constexpr 函数常量表达式的限制 constexpr 函数常量表达式有一些限制: 1. constexpr 函数必须有一个返回值,而且返回值必须是字面类型。 2. constexpr 函数函数体必须足够简单,能在编译时被求值。 3. constexpr 函数不能包含任何副作用,比如修改全局变量或调用非 constexpr 函数。 4. constexpr 函数的参数和返回值必须是字面类型。 5. constexpr 对象必须被声明为 const,而且必须用常量表达式初始化。 6. constexpr 对象的类型必须是字面类型。 总结 constexpr 关键字用于指定函数或对象是常量表达式。constexpr 函数常量表达式必须在编译时就能计算出值,它们有一些限制。constexpr 函数常量表达式可以用于数组大小、模板参数等需要在编译时确定的地方。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值