このプログラムをgcc-4.6.3またはgcc-4.7.2のいずれかでコンパイルすると、コンパイラーは、オーバーロードされた呼び出しがあいまいであるというエラーを表示します。
#include <iostream>
#include <functional>
class Scott
{
public:
void func(const bool b = true)
{
std::cout << "Called func() with a boolean arg" << std::endl;
}
void func(std::function<void(void)> f)
#ifdef WITH_CONST
const
#endif
{
std::cout << "Called func() with a std::function arg" << std::endl;
}
};
int main (int argc, char *argv[])
{
Scott s;
s.func([] (void) { });
}
ただし、オーバーロードされた関数をconstにすると、正常にコンパイルされ、予期しないメソッドが呼び出されます。
devaus120>> g++ -Wall -std=c++11 -DWITH_CONST wtf.cxx
devaus120>> ./a.out
Called func() with a boolean arg
だから、私は2つの質問があります:
- オーバーロードされたメソッドがconstになったときにこれがコンパイルされるのはコンパイラのバグですか?
- 正しいオーバーロードされた関数が呼び出されるようにするにはどうすればよいですか?(どういうわけか議論を投げかける必要がありますか?)
TIA。
スコット。:)