次のオーバーロードされた関数を検討してください。
template <class T>
void foo(const T& v)
{
std::cout << "Generic version" << std::endl;
}
void foo(std::pair<const void*, std::size_t> p)
{
std::cout << "Pair version" << std::endl;
}
以下では、2 番目のオーバーロード ( を取るものstd::pair
) が呼び出されることを期待しています。
int main()
{
const void* buf = 0;
std::size_t sz = 0;
foo(std::make_pair(buf, sz));
}
ただし、このコードは実際にはジェネリック バージョンを呼び出します。具体的に取るオーバーロードにバインドしないのはなぜstd::pair
ですか? これはコンパイラのバグですか? 私はかなり古いコンパイラ、GCC 4.1.2 を使用しています。