Question: According to my compiler gcc-4.6 the call to func in the example below is ambigous.

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

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

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

```

Is the compiler correct in saying this? If I remove the first overload this code won't compile as it will fail to instantiate the templates involved.

Is there anyway to resolve this beside either renaming one of the two functions or by explicitly converting to std::string?

Answer: 
You could also add a third overload to explicitly capture the string literal case:

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

```
It can be resolved by SFINAE in the constructor of `std::function`. However, it doesn't seem to be required and isn't provided by GCC. So you can't portably depend on it working out.