在逗号列表中从空整数转换为指针

时间:2015-11-10 18:37:28

标签: c++ pointers null c++98

我知道在我们的现代世界中,NULL和0不是使用指针操作的最佳实践,并且根据cppreference:

  

指针转换空指针常量(参见NULL)可以   转换为任何指针类型,结果是空指针   该类型的价值。这种转换(称为空指针转换)   允许转换为cv限定类型作为单个转换,   也就是说,它不被认为是数字和限定的组合   转化

但是为什么不允许这个代码和gcc with clang给我一个错误?

A* foo()
{
    return (bar(), NULL);
}
  

错误:从long int到A *

的转换无效

2 个答案:

答案 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的值可以分配给指针。