"typedef function"的变量初始化为NULL,编译失败?



以下代码,在我的计算机上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变量,可转换为可移植使用的任何类型的空指针。

相关内容

  • 没有找到相关文章

最新更新