Hello,
the following program fails to compile with clang trunk and libc++ trunk (note the implicit conversion from <const char*>
to <std::string> when calling the functor in <doIt>):
#include <functional>
using namespace std::placeholders;
template <typename Functor>
static void doIt(Functor f)
{
f("");
}
static void method(const std::string&); // A
//static void method(const char*); // B
int main(int, char**)
{
doIt(std::bind(&method, _1));
}
This results in the following error:
$ ~/LLVM/build/Release+Asserts/bin/clang -std=c++0x -stdlib=libc++ clang.cpp
In file included from clang.cpp:1:
/usr/include/c++/v1/functional:1620:8: error: no type named 'type' in 'std::__1::__invoke_of<void
(*&)(const std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>
> &), char const (&)[1]>'
>::type type;
Commenting line (A) and uncommenting line (B), i.e. removing the implicit conversion, makes the code compile.
I looked into the standard, section 20.8, but was unable to find anything about implicit conversions, although it seems to
me from reading 20.8.2p1 that they should be allowed.
A similar code used to compile with an older version of libc++ (most likely before Howard's implementations in r131639ff.
So my question is: Is this a bug in libc++, or are implicit conversions not allowed, and the similar code used to compile
because of an implementation artefact that was removed during r131639ff?
With many thanks in advance,
Jonathan