C++ C++;can';t将一对指针初始化为NULL
我正在使用g++4.4.7进行编译(目前不能再高了),并使用C++ C++;can';t将一对指针初始化为NULL,c++,pointers,null,std-pair,C++,Pointers,Null,Std Pair,我正在使用g++4.4.7进行编译(目前不能再高了),并使用-std=gnu++0x编译器开关,该开关应允许第三行的语法 typedef std::vector<CI_RecordInfo_Pair> CI_RecordInfo_Vector; typedef std::vector<std::pair<std::string, CI_RecordInfo_Vector*> > MgrBlks; MgrBlks mgr_n_blks { {"T2M_NAM
-std=gnu++0x
编译器开关,该开关应允许第三行的语法
typedef std::vector<CI_RecordInfo_Pair> CI_RecordInfo_Vector;
typedef std::vector<std::pair<std::string, CI_RecordInfo_Vector*> > MgrBlks;
MgrBlks mgr_n_blks { {"T2M_NAME", NULL} }; // <--- line 59
有什么区别?编译器拒绝这一行是正确的:
MgrBlks mgr_n_blks { {"T2M_NAME", NULL} };
在C++11std::pair
中,有一个模板构造函数,它接受任何参数类型,然后将它们转换为成员:
template<typename X, typename Y>
pair(X&& x, Y&& y)
: first(std::forward<X>(x)), second(std::forward<Y>(y))
{ }
但是使用
nullptr
比使用nullptr
更简单、更清晰。使用nullptr
代替NULL
有效吗?g++4.4不支持它。直到4.6。如果NULL
被定义为0
,则其类型为int
,而不是long
。显然,实现将NULL
定义为0L
或类似的内容。在g++4.7.2中,NULL
扩展为\uu NULL
,这显然是long
类型。直到g++4.6才添加nullptr,但强制转换NULL编译正确。@Chap roll您自己的nullptr
也可以完成--不要称它为nullptr
,但是你可以不用花很多钱就能获得大部分好处。@KeithThompson,我说过“NULL
定义为0
或0L
或类似的值”。我认为很明显,它不会在所有情况下都被推断为long
,但我会澄清这一点。显然,对于GCC,它被推断为long
,但这不是标准所要求的。您的回答似乎暗示0
将解析为long
;你最近编辑修复了这个问题。
MgrBlks mgr_n_blks { {"T2M_NAME", NULL} };
template<typename X, typename Y>
pair(X&& x, Y&& y)
: first(std::forward<X>(x)), second(std::forward<Y>(y))
{ }
MgrBlks mgr_n_blks { {"T2M_NAME", (CI_RecordInfo_Vector*)NULL} };