C++ inline constexpr 内联函数和常量表达式函数有关问题

C++ inline constexpr 内联函数和常量表达式函数问题

函数问题

一)inline: 内联函数,就是相当于把被调用的函数硬嵌入调用它的函数中去,不用保存栈,所以速度快。

1. 要使inline起作用,必须是inline函数定义(不但是声明)在其调用函数范围内

2. 不同头文件包含相同inline函数,不是重定义,但是两个或多个inline函数必须一模一样。

二)constexpr:如果参数是常量,就可以了在编译时计算的函数。

定义一个constexpr函数是为了可以使得函数用于常量表达式中,例如:

constexpr int fac(int n)
{
return (n>1) ? n∗fac(n−1) : 1;
}
constexpr int f9 = fac(9); // must be evaluated at compile time


 

void f(int n)
{
int f5 = fac(5); // may be evaluated at compile time
int fn = fac(n); // evaluated at run time (n is a var iable)
constexpr int f6 = fac(6); // must be evaluated at compile time
constexpr int fnn = fac(n); // error : can’t guarantee compile-time evaluation (n is a var iable)
char a[fac(4)]; // OK: array bounds must be constants and fac() is constexpr
char a2[fac(n)]; // error : array bounds must be constants and n is a var iable
// ...
}

constexpr函数有很多限制,constexpr机制也只是用于相对简单的功能的,如下:

int glob;
constexpr void bad1(int a) // error : constexpr function cannot be void
{
glob = a; // error : side effect in constexpr function
}
constexpr int bad2(int a)
{
if (a>=0) return a; else return −a; // error : if-statement in constexpr function
}
constexpr int bad3(int a)
{
sum = 0; // error : local var iable in constexpr function
for (int i=0; i<a; +=i) sum +=fac(i); // error : loop in constexpr function
return sum;
}

也如内联函数一样,在不同.h文件中,定义必须相同。可以认为constexpr函数是一个受限制的内联函数。

Constexpr函数不能写操作非局部函数。但是可以读操作非局部函数,可以使用作引用参数,但是也不能作写操作。如:

constexpr int ftbl[] { 1, 2, 3, 5, 8, 13 };
constexpr int fib(int n)
{
return (n<sizeof(ftbl)/siz eof(∗ftbl)) ? ftbl[n] : fib(n);
}


有条件选择句调用constexpr函数是,不选择的分支函数计算是在run-time是发生的。

 

函数返回值问题:
string to_string(int a); //前置返回值 prefix return type
auto to_string(int a) −> string; //后置返回值suffix return type

两者是一样效果的。

后者主要使用在模板中,如下:
template<class T, class U>
auto product(const vector<T>& x, const vector<U>& y) −> decltype(x∗y);

 

注意不要返回临时变量指针或引用。