0值的自动整数转换失败
automatic integer conversion of a 0 value fails
我有这个源文件:
#include <ctime>
class A
{
public:
A(unsigned long i){};
A(const tm*){};
};
int main(int argc, char** argv)
{
A tit(1);
A tat(0);
return 0;
}
当我使用gcc 3.4.2编译它时,我得到了以下内容:
autoCast.cpp:函数
int main(int, char**)':
中的A(int)'不明确
autoCast.cpp:13: error: call of overloaded
autoCast.cpp:4:注意:候选为:A::A(const A&)
autoCast.cpp:7:注意:A::A.(const tm*)
autoCast.cpp:6:注意:A::A(long unsigned int)
我的问题是:为什么创建A tit(1)
(第12行)成功,而创建A tat(0)
(第13行)失败?我在这些行中尝试了不同的参数类型(例如0ULL和1ULL),但当参数值为0时,它总是失败,而当参数值是1时,它成功了。唯一没有引发错误的0值是0UL(因为我想不需要转换)。为什么在这种情况下,值为0的整数与值为1的整数得到不同的处理?它是否与time.h中定义的tm结构有关?
这是因为0
是空指针常量,可以转换为无符号长或指针,因此选择哪个不明确。C++标准草案4.10
指针转换说(强调矿):
空指针常量是整数类型的整数常量表达式(5.19)prvalue,其求值结果为零或std::nullptr_t类型的prvalue空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的其他值区分开来。
而1
不是空指针常量。虽然0UL
也可以转换为指针,但它与无符号长构造函数更匹配,因为不需要转换。
文字0
通常用于初始化指向null的指针(诚然,现代C++应该使用nullptr
)。然而,直接用任何其他整数文字初始化指针是相对罕见的(例如,在使用内存映射的嵌入式系统中除外)。
因此,编译器将0
视为指针或整数,这意味着它可以调用任一构造函数。相反,它将1
简单地视为一个整数。
- 努力将整数转换为链表。不知道我在这里做错了什么
- 如何在C++中将整数转换为其数字数组
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 将最小值整数转换为无符号长整型
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将74位整数转换为以31为底的整数
- 独立于实现的浮点/整数转换
- 以最少的步骤将给定整数转换为另一个整数
- 浮点到整数转换出错(即使浮点数已经是整数)
- 了解双精度转换与整数转换中的整数与截断关系
- 禁止具有精度损失的整数转换
- 将任意整数转换为 void*
- 将 32 位大端有符号整数转换为有符号小端整数
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- 使用函数时从整数转换为字符串
- 尝试从整数转换为字符串的月份
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 如何避免字符串到整数转换情况下的无效参数异常