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只是一個常量指針,而非指向常量對象的指針;
}
是不是非常的迷惑人?
由以上兩點就很容易看出,這種寫法當然是錯的。