我知道在我们的现代世界中,NULL和0不是使用指针操作的最佳实践,并且根据cppreference:
指针转换空指针常量(参见NULL)可以 转换为任何指针类型,结果是空指针 该类型的价值。这种转换(称为空指针转换) 允许转换为cv限定类型作为单个转换, 也就是说,它不被认为是数字和限定的组合 转化
但是为什么不允许这个代码和gcc with clang给我一个错误?
A* foo()
{
return (bar(), NULL);
}
错误:从long int到A *
的转换无效
答案 0 :(得分:3)
答案显示在你的问题中。
空指针常量(参见NULL),可以转换为any 指针类型,结果是该类型的空指针值。
NULL
是常数,bar(), 0
不是常数。
比较一下:
A* foo()
{
return 0;
}
与
A* foo()
{
int v = 0;
return v;
}
与
A* foo()
{
const int v = 0;
return v;
}
答案 1 :(得分:3)
这里的问题是
(bar(), NULL)
是使用comma operator的表达式。
在逗号表达式E1,E2中,表达式E1被评估,其结果被丢弃,并且在表达式E2开始评估之前完成其副作用(注意用户定义的运算符,不能保证排序)。 / p>
逗号表达式结果的类型,值和值类别正是第二个操作数的类型,值和值类别,E2 。如果E2是临时的,则表达式的结果是临时的。如果E2是位字段,则结果是位字段。
因此,(bar(), NULL)
的类型被确定为long int
,因为它是NULL
的类型所以它正在尝试将long int
转换为{的值{1}} NULL
将失败。
如果我们将代码更改为
A*
这将编译为使用A* foo()
{
return NULL;
}
的值,并且NULL
的值可以分配给指针。