lambda expression でスコープ内の constexpr を参照する

こんな事が許されるんですね…。

[ソース]

template<typename T>
void
static_assert_(T){
    static_assert(T()(), "");
}

int
main(){
    constexpr int num = 10;
    auto x = []{
        struct X{
            constexpr int
            operator ()() const{
                return num;
            }
        };
        return X{};
    }();
    static_assert(decltype(x){}() == 10, "");
    static_assert(decltype(x){}() != 42, "");
    static_assert_(x);

    constexpr int value = 3;
    auto plus_value = []{
        struct X{
            constexpr int
            operator ()(int n) const{
                return value + n;
            }
        };
        return X{};
    }();
    static_assert(decltype(plus_value){}(4) == 7, "");
    static_assert(decltype(plus_value){}(2) == 5, "");

    return 0;
}

これはなにか悪さが出来そうな気がするゾ!

[コンパイラ]

  • g++ (GCC) 4.7.0 20111203 (experimental)
  • clang++ (llvm) 3.1 20120216(trunk)