[cfe-dev] Compile error with libc++'s bind

Jonathan Sauer jonathan.sauer at gmx.de
Fri May 20 11:59:40 PDT 2011


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





More information about the cfe-dev mailing list