我知道在我们的现代世界中 NULL 和 0 并不是指针操作的最佳实践,根据 cppreference:
指针转换 空指针常量(参见 NULL)可以是
转换为任意指针类型,结果为空指针
该类型的值。这种转换(称为空指针转换)
允许作为单个转换转换为 cv 限定类型,
也就是说,它不被视为数字和限定的组合
转换。
但为什么这个代码是不允许的,并且带有 clang 的 gcc 给我一个错误?
A* foo()
{
return (bar(), NULL);
}
错误:从 long int 到 A* 的转换无效
这里的问题是
(bar(), NULL)
是一个使用以下表达式逗号运算符 http://en.cppreference.com/w/cpp/language/operator_other.
在逗号表达式 E1, E2 中,表达式 E1 被求值,其结果被丢弃,并且其副作用在表达式 E2 的求值开始之前完成(注意,用户定义的运算符,不能保证排序)。
逗号表达式结果的类型、值和值类别正是第二个操作数 E2 的类型、值和值类别。如果 E2 是临时变量,则表达式的结果就是该临时变量。如果 E2 是位字段,则结果也是位字段。
所以类型(bar(), NULL)
被确定为long int
因为这就是类型NULL
所以它正在尝试转换long int
与价值NULL
to an A*
这将会失败。
如果我们将代码更改为
A* foo()
{
return NULL;
}
这将编译为以下值NULL
被使用并且值NULL
可以分配给一个指针。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)