如果類沒有任何 constexpr 建構式,是否有任何理由將 constexpr 添加到類的方法中?也許編譯器可以在這種情況下做一些優化?
uj5u.com熱心網友回復:
是的,一個明顯的情況是該類是一個聚合類。聚合初始化不呼叫任何建構式,但仍可用于常量運算式求值。
即使該類不是聚合類,constexpr
如果成員函式不訪問類實體的任何狀態,您仍然可以在常量運算式求值中呼叫成員函式。這顯然是static
成員函式的情況,但也適用于非static
成員函式。
例如,以下是有效的:
struct A {
int i;
// The only usable constructor is the default constructor,
// which is not `constexpr`.
// The class is also not an aggregate class because of these declarations.
A() : i(0) {}
A(const A&) = delete;
constexpr int getZero() {
// return i; would be IFNDR
return 0;
}
};
int main() {
A a;
constexpr int x = a.getZero();
}
但是您必須小心,因為如果完全不可能將成員函式呼叫為任何常量運算式的子運算式,那么constexpr
無論如何標記它會使程式格式錯誤,不需要診斷(IFNDR)。換句話說,編譯器可能拒絕編譯這樣的程式。
此外,這種情況多久出現一次以及打算使用持續評估用例(尤其是對于非static
成員函式),是一個不同的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/498098.html
上一篇:Python中的引數預設為類變數
下一篇:Python中的類物件和型別別