constexpr变量:
由于常量表达式在实际编程中比较难判断,所以c++引入constexpr来判断一个表达式是否为constexpr。
被声明为constexpr的表达式一定是一个常量表达式,如果不是,编译器则会在编译阶段报错。 一般说来,如果你认定变量是常量表达式,那就把它声明为constexpr类型。例子:
constexpr int size = 100; // 正确。constexpr auto charN = cin.get(); // 错误,cin.get()不是一个常量表达式。 可以被定义为constexpr的类型包括【算术类型】【引用】【指针】;这些类型被称为字面值类型。如果constexpr定义的是一个指针,则限定符constexpr仅对指针有效,对指针所指的对象无关。注意:自定义类、Sales_item、IO库、string类型则不属于字面值类型。(涉及编译原理,了解并不多)
---------------------------------------------------------------------------------------------------
非指针类型的const在作为auto的判断符时,会被auto忽略。const int cr = 12;
auto p = 12; // p的类型为int;指针类型的底层const不会被忽略;
const int *ci = &cr;
auto p1 = ci; // p1的类型为const int *;
在利用类型别名定义const对象和原本的类型名定义const对象是有差别的。
#include <iostream>
using namespace std;
using pstring = char *;int main() {
const char *str = nullptr; // 指向的是一个 常量对象 的 常量指针
const pstring cstr = nullptr; // 指向的是一个 普通对象 的 指针常量}所以在定义过程中有“*”和没有“*” 定义变量的过程是不一样的,编译器会按照不同的方式处理。
那么类似于如下写法:
#include <iostream>
using namespace std;
using pstring = char *;int main() {
const char i = '4';
const pstring p = &i; // 错误,p只是一个常量指针,而非指向常量对象的指针;} 是不是非常的迷惑人?由以上两点就很容易看出,这种写法当然是错的。