私はclang3.1(gccは正常に動作します)でこの奇妙な問題を抱えています(ここでコードを簡略化しました)。std :: function(値で渡される)の不適切な使用またはclangのバグですか?
template <typename Container>
struct A
{
using function_type = std::function<char(char)>;
A(Container c, function_type f) : it_(c.begin()), f_(f) {}
typename Container::value_type operator*() { return *it_; }
typename Container::iterator it_;
function_type f_;
};
template <typename Cont>
A<Cont> makeA(Cont c, std::function<char(char)> f)
{
return A<Cont>(c, f);
}
char f(char ch) { return ch; }
int main()
{
std::string s { "foo" };
auto a = makeA(s, f); // wraps s.begin()
std::clog << "main: " << *(s.begin()) << std::endl; // prints 'f'
std::clog << "main: " << *a << std::endl; // prints garbage
return 0;
}
Max OSXLionでAppleclang4.1(llvm 3.1)を使用しています。
2番目のパラメーターのタイプを別のパラメーター(intなど)に変更すると、すべてが正常に機能します。
'make'ファクトリを使用する代わりに、ctorから直接Aオブジェクトを作成すると、すべてが正常に機能します。
それがclangのバグなのか、私の誤解なのか、本当に理解できません。