2011-08-21 14 views
5

私のコンパイラgcc-4.6によると、以下の例のfuncの呼び出しはあいまいです。あいまいな呼び出し(char *からlambdaとstd :: stringへの変換)

void func(const std::string &str) { 
} 

void func(std::function<std::string()> f) { 
} 

void test() { 
    func("Hello"); 
} 

これでコンパイラは正しいですか?最初のオーバーロードを削除すると、関連するテンプレートをインスタンス化できないため、このコードはコンパイルされません。

2つの関数の名前を変更するか、明示的にstd :: stringに変換するかのどちらかを解決するにはどうしますか?

答えて

3

また、明示的に文字列リテラルケースをキャプチャするために3番目のオーバーロードを追加することができます。

void func(char const* cstr) { 
    return func(std::string(cstr)); 
} 
4

それはstd::functionのコンストラクタでSFINAEによって解決することができます。しかし、それは必要ではないようで、GCCでは提供されていません。だからあなたは移植可能にそれに取り組むことはできません。

+0

これはばかげているようですね! –

+1

@トマラク:そうです。 – Puppy

+0

私は実装がこれを行うことが許されているかどうかも分かりません。誰かがスペック参照を見つけたり、さらに説明したりすることができれば嬉しいです。 –

関連する問題