Pertimbangkan kelas yang baru saja membungkus nilai saat runtime :
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;
};
dan versi constexprnya:
template <typename Type>
class ConstValue
{
public:
constexpr ConstValue(const Type& val) : _value(val) {;}
constexpr Type get() const {return _value;}
protected:
const Type _value;
};
Pertanyaan 1 : Dapatkah Anda memastikan bahwa versi constexpr dirancang dengan cara yang benar?
Pertanyaan 2 : Bagaimana Anda menggabungkan kedua kelas menjadi satu yang disebut Value
yang dapat dibuat constexpr
atau dibuat pada waktu proses dan yang nilainya dapat get()
pada waktu proses atau waktu kompilasi?
EDIT: Pertanyaan 3: Jika get()
didefinisikan dalam file .cpp
, dan jika saya ingin get()
disisipkan jika bukan constexpr
, apa deklarasi fungsi yang benar? Apakah itu
constexpr inline Type get();
or
inline constexpr Type get()
atau sesuatu yang lain ?
constexpr
fungsi dapat dipanggil pada waktu kompilasi atau waktu proses. - person chris   schedule 18.01.2013constexpr
non-statis mempunyai kelemahan karena selalu menyiratkan kualifikasi fungsiconst
, yaituconstexpr foo bar();
adalah deklarasi yang sama denganconstexpr foo bar() const;
. Tidak ada persyaratan seperti itu untuk non-anggota, yaituconstexpr foo bar(T&);
atauconstexpr foo bar(T&&);
keduanya dapat menerima non-constT
(dan dimungkinkan untuk memiliki ekspresi konstan yang melibatkan tipe kelas berkualifikasi non-const). Jadi berhati-hatilah terhadap hal itu. - person Luc Danton   schedule 18.01.2013