constexpr 関数内ではローカルクラスが定義出来ない
実は勘違いしていた C++11 の仕様シリーズ。
タイトル通りなんですが、constexpr関数内ではローカルクラスを定義することは出来ません。
constexpr int func(){ // clang3.1 error: types cannot be defined in a constexpr function class X{}; return 10; }
そんな感じでこれをそのまま使うのはボツかなぁ…。
まぁ関数の外でクラス定義してしまえばいいんですが。
ちなみに gcc4.7 だと上記のコードでも問題なく動いてしまいます。
[おまけ]
ついでなので『constexpr でエラー出力』を clang3.1 でも試してみました。
[ソース]
struct error_division_by_zero{ int operator()() const{ throw("division by zero"); } }; constexpr int division(int a, int b){ return b == 0 ? error_division_by_zero()() : a / b; } int main(){ constexpr int x1 = division(4, 2); // ok constexpr int x2 = division(4, 0); // error return 0; }
[出力]
main.cpp|14 col 19| error: constexpr variable 'x2' must be initialized by a constant expression || constexpr int x2 = division(4, 0); // error || ^ ~~~~~~~~~~~~~~ main.cpp|7 col 21| note: non-constexpr function 'operator()' cannot be used in a constant expression || return b == 0 ? error_division_by_zero()() || ^ main.cpp|14 col 24| note: in call to 'division(4, 0)' || constexpr int x2 = division(4, 0); // error || ^ main.cpp|2 col 6| note: declared here || int operator()() const{ throw("division by zero"); } || ^ || 1 error generated.
んーもうちょっとすっきりさせることが出来そうな感じがしますね。