#include <utility>
struct A {
constexpr auto one(int a) {
return std::integral_constant<int, _data[a]>{};
}
constexpr int two(int a) const {
return _data[a];
}
int _data[10];
};
int main() {
constexpr auto ex = A{{1,2,3,4,5,6,7,8,9,10}};
std::integral_constant<int, ex.two(3)> b{};
}
上面的代碼不會在主幹鐺中編譯。該錯誤是在one()
成員函數,並說:C++ constexpr自動成員函數。鏗鏘的問題?
cc.cpp:57:44: note: implicit use of 'this' pointer is only allowed
within the evaluation of a call to a 'constexpr' member function.
顯然,函數標記爲constexpr
,如果你註釋掉one()
成員,一切編譯罰款,所以我們顯然能夠從創建integral_constant
ex
,但不是直接從struct
?這似乎是,當我需要auto
返回類型扣除,它失敗並聲稱該功能不是constexpr
?
這是預期嗎?我覺得這不應該是一個問題,如果這是預期的行爲,我會感到驚訝。
'_data [a]'不是'A :: one'內的常量表達式。請注意,'constexpr'函數仍然可以在運行時調用,例如如果您提供僅在運行時已知的參數。 – dyp
這是'two'中的一個constexpr,通過使用它的返回值作爲模板參數來證明它? – pat
據我所知,'_data [a]'在兩個成員函數中都不是一個常量表達式。但是constexpr函數可以由非常量表達式組成。規則是:在需要一個常量表達式的上下文中,不可以評估非常量的東西(包括一個constexpr函數的一部分)。另外,在需要常量表達式的上下文中,必須有一種方法可以合法調用'constexpr'函數。 – dyp