我想從「設計模式」編譯一個例子,我面臨着以下問題:如果基類構造函數不是constexpr,我可以構造派生類constexpr的構造函數嗎?
我有一個基類網站地圖:
class MapSite{
public:
MapSite();
virtual ~MapSite();
virtual void Enter() = 0;
};
和派生類中房:
class Room : public MapSite final{
private:
unsigned int room_number;
public:
Room(unsigned int rn) : room_number(rn) {};
virtual void Enter() override;
};
從另一個類我要調用的函數
virtual std::unique_ptr<Room> MakeRoom(unsigned int n) {return make_unique<Room(n)>();}
當我這樣做,我得到以下錯誤:
error: temporary of non-literal type ‘Room’ in a constant expression
virtual std::unique_ptr<Room> MakeRoom(unsigned int n) {return unique::make_unique<Room(n)>();}
所以我想這個問題可能是在構造函數必須是constexpr
爲了從另一個函數調用間的構造函數,但構造函數設置:
constexpr Room(unsigned int rn) : room_number(rn) {};
會產生這樣的錯誤:
error: call to non-constexpr function ‘MapSite::MapSite()’
constexpr Room(unsigned int rn) : room_number(rn) {};
我的基本問題是,我能否馬ke是派生類構造函數constexpr,即使基類構造函數不是。或者,如果有更好的概念來解決這個問題。
PS:make_unique是一個C++ 14功能,我從這裏How to implement make_unique function in C++11?爲C++ 11,模擬其我與
問問自己:那些甚至試圖在常量表達式中使用'Room'的代碼是什麼?爲什麼? – Barry