2

constexpr 関数をラムダと一緒に使用すると、問題が発生しました。次のコードは、エラーを再現する最小限のバージョンです。

#include <iostream>

constexpr unsigned bar(unsigned q) {
    return q;
}

template<unsigned N>
unsigned foo() {
    return N;
}

template<typename F>
void print(F f) {
    std::cout << f() << std::endl;
}

template<unsigned Q>
int stuff() {
    constexpr unsigned n = bar(Q);
    print([]() { return foo<n>(); });
}

int main() {
    stuff<13>();
}

でコンパイルするとgcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)、次のコンパイラ エラーが発生します。

constexpr_template.cpp: In lambda function:
constexpr_template.cpp:24:9:   instantiated from ‘stuff() [with unsigned int Q = 13u]::<lambda()>’
constexpr_template.cpp:24:2:   instantiated from ‘int stuff() [with unsigned int Q = 13u]’
constexpr_template.cpp:29:12:   instantiated from here
constexpr_template.cpp:24:32: error: no matching function for call to ‘foo()’
constexpr_template.cpp:24:32: note: candidate is:
constexpr_template.cpp:9:10: note: template<unsigned int N> unsigned int foo()

奇妙な部分は、にconstexpr unsigned n = bar(Q);変更された場合に機能するconstexpr unsigned n = Q;ことです。また、機能しているのはprint([]() { return foo<bar(Q)>(); });...

これは GCC のバグですか、それとも何が間違っていますか?

4

1 に答える 1