ทั้งconst
และconstexpr
สามารถนำไปใช้กับตัวแปรและฟังก์ชั่น แม้ว่าพวกเขาจะมีความคล้ายคลึงกันในความเป็นจริงพวกเขามีแนวคิดที่แตกต่างกันมาก
ทั้งconst
และconstexpr
หมายความว่าค่าของพวกเขาไม่สามารถเปลี่ยนแปลงได้หลังจากการเริ่มต้น ตัวอย่างเช่น:
const int x1=10;
constexpr int x2=10;
x1=20; // ERROR. Variable 'x1' can't be changed.
x2=20; // ERROR. Variable 'x2' can't be changed.
ความแตกต่างหลักระหว่างconst
และconstexpr
คือเวลาที่ทราบค่าเริ่มต้น (ประเมิน) ในขณะที่ค่าของconst
ตัวแปรสามารถประเมินได้ทั้งเวลาคอมไพล์และรันไทม์ แต่constexpr
จะถูกประเมินที่เวลาคอมไพล์เสมอ ตัวอย่างเช่น:
int temp=rand(); // temp is generated by the the random generator at runtime.
const int x1=10; // OK - known at compile time.
const int x2=temp; // OK - known only at runtime.
constexpr int x3=10; // OK - known at compile time.
constexpr int x4=temp; // ERROR. Compiler can't figure out the value of 'temp' variable at compile time so `constexpr` can't be applied here.
ข้อได้เปรียบที่สำคัญเพื่อทราบว่าค่าเป็นที่รู้จักกันในเวลารวบรวมหรือรันไทม์คือความจริงที่ว่าค่าคงที่เวลารวบรวมสามารถนำมาใช้เมื่อใดก็ตามที่ยังคงต้องใช้เวลารวบรวม ตัวอย่างเช่น C ++ ไม่อนุญาตให้คุณระบุ C-arrays ด้วยความยาวของตัวแปร
int temp=rand(); // temp is generated by the the random generator at runtime.
int array1[10]; // OK.
int array2[temp]; // ERROR.
ดังนั้นหมายความว่า:
const int size1=10; // OK - value known at compile time.
const int size2=temp; // OK - value known only at runtime.
constexpr int size3=10; // OK - value known at compile time.
int array3[size1]; // OK - size is known at compile time.
int array4[size2]; // ERROR - size is known only at runtime time.
int array5[size3]; // OK - size is known at compile time.
ดังนั้นconst
ตัวแปรสามารถกำหนดทั้งค่าคงที่เวลาคอมไพล์เช่นsize1
ที่สามารถใช้เพื่อระบุขนาดของอาเรย์และค่าคงที่รันไทม์แบบsize2
ที่รู้จักกันเฉพาะที่รันไทม์และไม่สามารถใช้เพื่อกำหนดขนาดของอาเรย์ ในอีกทางหนึ่งconstexpr
จะกำหนดค่าคงที่เวลาการคอมไพล์ที่สามารถระบุขนาดอาร์เรย์ได้เสมอ
ทั้งconst
และconstexpr
สามารถนำไปใช้กับฟังก์ชั่นได้เช่นกัน const
ฟังก์ชั่นจะต้องเป็นสมาชิกฟังก์ชัน (วิธีการดำเนินการ) ที่ประยุกต์ใช้const
วิธีการคำหลักว่าวิธีการที่ไม่สามารถเปลี่ยนค่าของสมาชิก (ไม่คงที่) สาขาของพวกเขา ตัวอย่างเช่น.
class test
{
int x;
void function1()
{
x=100; // OK.
}
void function2() const
{
x=100; // ERROR. The const methods can't change the values of object fields.
}
};
A constexpr
เป็นแนวคิดที่แตกต่าง มันเครื่องหมายฟังก์ชั่น (สมาชิกหรือไม่ใช่สมาชิก) เป็นฟังก์ชั่นที่สามารถได้รับการประเมินที่รวบรวมเวลาถ้าค่าคงที่รวบรวมเวลาจะผ่านไปเป็นข้อโต้แย้งของพวกเขา ตัวอย่างเช่นคุณสามารถเขียนสิ่งนี้
constexpr int func_constexpr(int X, int Y)
{
return(X*Y);
}
int func(int X, int Y)
{
return(X*Y);
}
int array1[func_constexpr(10,20)]; // OK - func_constexpr() can be evaluated at compile time.
int array2[func(10,20)]; // ERROR - func() is not a constexpr function.
int array3[func_constexpr(10,rand())]; // ERROR - even though func_constexpr() is the 'constexpr' function, the expression 'constexpr(10,rand())' can't be evaluated at compile time.
โดยวิธีการที่constexpr
ฟังก์ชั่นเป็นฟังก์ชั่น C ++ ปกติที่สามารถเรียกว่าแม้ว่าข้อโต้แย้งที่ไม่คงที่จะถูกส่งผ่าน แต่ในกรณีนั้นคุณจะได้รับค่าที่ไม่ใช่ค่าเริ่มต้น
int value1=func_constexpr(10,rand()); // OK. value1 is non-constexpr value that is evaluated in runtime.
constexpr int value2=func_constexpr(10,rand()); // ERROR. value2 is constexpr and the expression func_constexpr(10,rand()) can't be evaluated at compile time.
constexpr
สามารถนำไปใช้ยังรวมถึงฟังก์ชั่นสมาชิก (วิธีการ) ผู้ประกอบการและแม้กระทั่งการก่อสร้าง ตัวอย่างเช่น
class test2
{
static constexpr int function(int value)
{
return(value+1);
}
void f()
{
int x[function(10)];
}
};
ตัวอย่าง 'บ้า' มากขึ้น
class test3
{
public:
int value;
// constexpr const method - can't chanage the values of object fields and can be evaluated at compile time.
constexpr int getvalue() const
{
return(value);
}
constexpr test3(int Value)
: value(Value)
{
}
};
constexpr test3 x(100); // OK. Constructor is constexpr.
int array[x.getvalue()]; // OK. x.getvalue() is constexpr and can be evaluated at compile time.
constexpr
สร้างค่าคงที่เวลารวบรวมconst
เพียงหมายความว่าค่านั้นไม่สามารถเปลี่ยนแปลงได้