练习6.43
inline bool eq(const BigInt&,const BiGInt&)
{
}
内联函数放在头文件里面, 形参类型是const BigInt &。
void putValues(int *arr, int size);
声明放头文件里。
练习6.44
改成内联函数:
inline bool isShorter(const string& s1, const string& s2) {
return s1.size() < s2.size();
}
函数开头加上inline即可。可以放进头文件里面。
练习6.46
不能改写成constexpr类型。
constexpr bool isShorter(const string& s1, const string& s2) {
return s1.size() < s2.size();
}
int main() {
string s1 = "abc";
string s2 = "abcd";
cout << isShorter(s1, s2);
}
报错:返回的不是常量表达式。我理解的原因是,返回的值调用了size函数,但是这个size函数也不是一个constexpr函数,结果的具体值直到运行的时候才获取到,所以is shorter不能写成constexpr函数。
常量表达式(const expression)是指值不会改变并且在编译过程中就能得到计算结果的表达式。比如,字面值就属于常量表达式,用常量表达式初始化的const(常量)对象也是常量表达式。
在一个复杂系统中,很难确定一个初始值是不是常量表达式。C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量值是否是一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
尽管不能使用普通函数作为constexpr变量的初始值,但是新标准允许定义一种特殊的constexpr函数。(内联函数)这种函数应该足够简单以使得编译时就可以计算其结果,这样就可以用constexpr函数去初始化constexpr变量了。