以下代码,在我的计算机上VS2015无法编译,但它可以在其他计算机上成功编译!
#include <functional>
using namespace std::tr1;
typedef function<void()> OnRun;
class CTest
{
public:
CTest()
{
//The compilation fails
//if I comment out the compilation is successful
pOnRun = NULL; // fail
//pOnRun = NULL; // OK
}
~CTest() {}
private:
OnRun pOnRun;
};
编译错误如下:
c:program files (x86)microsoft visual studio 14.0vcincludetype_traits(1494): error C2893: Failed to make function template "unknown-type std::invoke(_Callable &&,_Types &&...)" Specialization
typedef
是一个转移注意力的东西。std::function
有多个赋值运算符,它们都不需要一个int
。它也不能通过转换构造函数和拷贝赋值来工作,因为也没有来自int
的转换构造函数。但是,有一个赋值操作符接受nullptr
。
NULL
是一个旧式的C宏,和所有的宏一样,也有类似的类型问题。
来自VS的某些版本的stddef.h
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
我有很多问题。对于微软的开发人员来说,为什么他们会认为c++只需要一个int
就可以做到。为什么有C分支,而他们的编译器在那时不支持C环境。还有一些其他的头文件定义NULL,在这种情况下,bug可能不会出现,这取决于包含顺序。
实际上,这不起作用,因为在重载解析期间,int(0)
不能隐式转换为void(*)()
类型的指针:
pOnRun = 0;
不建议在c++代码中使用NULL, NULL是一些表达式,可以转换为空指针,但不保证是空指针。c++ 11定义了nullptr_t
类型的nullptr
变量,可转换为可移植使用的任何类型的空指针。