Since switching over to clang C++11 on OS X, we had this weird C++ oddity
surface while writing some new code. The problem is that ‘mutex’ is no longer a
variable, it is a class type that can be interpreted as a function argument.
That is, the following line of code can be interpreted as a function
declaration now:
OELock lock(mutex);
Instead of a scoped lock acquisition as has been convention for some time now.
The full code to recreate the subtle bug is as follows:
#include <mutex>
using namespace std;
struct OEMutex
{
void Acquire() {}
void Release() {}
};
static OEMutex _mutex;
class OELock
{
OEMutex &_mutex;
OELock();
OELock(const OELock&);
OELock& operator=(const OELock&);
public:
OELock(OEMutex &mutex) : _mutex(mutex) { _mutex.Acquire(); }
~OELock() { _mutex.Release(); }
};
int main()
{
OELock lock(mutex);
}
Ideally, we would like the compilation to fail and tell the user the ‘mutex’
variable can not be found. Any clever C++ trick to do that? We’ve tried
declaring the move constructors of OELock to be private, but it still compiles
(maybe that’s SFINAE?).
Thanks,
Brian
_______________________________________________
cfe-users mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users