พิจารณาคลาสที่เพิ่งล้อมค่าที่รันไทม์ :
template <typename Type>
class NonConstValue
{
public:
NonConstValue(const Type& val) : _value(val) {;}
Type get() const {return _value;}
void set(const Type& val) const {_value = val;}
protected:
Type _value;
};
และเวอร์ชัน constexpr ของสิ่งนั้น:
template <typename Type>
class ConstValue
{
public:
constexpr ConstValue(const Type& val) : _value(val) {;}
constexpr Type get() const {return _value;}
protected:
const Type _value;
};
คำถามที่ 1 : คุณยืนยันได้ไหมว่าเวอร์ชัน constexpr ได้รับการออกแบบมาอย่างถูกต้อง
คำถามที่ 2 : คุณจะผสมทั้งสองคลาสให้เป็นคลาสเดียวที่เรียกว่า Value
ที่สามารถ constexpr
สร้างหรือสร้างรันไทม์ได้อย่างไร และค่าใดที่สามารถเป็น get()
ได้ที่รันไทม์หรือคอมไพล์ไทม์
แก้ไข: คำถามที่ 3: หากกำหนด get()
ในไฟล์ .cpp
และหากฉันต้องการให้ get()
อยู่ในบรรทัดหากไม่ใช่ constexpr
การประกาศที่ถูกต้องของฟังก์ชันคืออะไร ใช่ไหม
constexpr inline Type get();
or
inline constexpr Type get()
หรืออย่างอื่น ?
constexpr
สามารถเรียกใช้ฟังก์ชันในเวลาคอมไพล์หรือรันไทม์ได้ - person chris   schedule 18.01.2013constexpr
ที่ไม่คงที่มีข้อบกพร่องตรงที่พวกมันบ่งบอกถึงตัวระบุฟังก์ชันconst
เสมอ นั่นคือconstexpr foo bar();
เป็นการประกาศเดียวกันกับconstexpr foo bar() const;
ไม่มีข้อกำหนดดังกล่าวสำหรับผู้ที่ไม่ใช่สมาชิก เช่นconstexpr foo bar(T&);
หรือconstexpr foo bar(T&&);
อาจยอมรับ non-constT
ทั้งคู่ (และเป็นไปได้ที่จะมีนิพจน์คงที่ที่เกี่ยวข้องกับประเภทคลาสที่ผ่านการรับรองที่ไม่ใช่ const) ดังนั้นจงระวังสิ่งนั้นด้วย - person Luc Danton   schedule 18.01.2013