gpt4 book ai didi

c++ - 0 值的自动整数转换失败

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:08 24 4
gpt4 key购买 nike

我有这个源文件:

#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: In function int main(int, char**)':<br/>
autoCast.cpp:13: error: call of overloaded
A(int)' is ambiguous
autoCast.cpp:4: note: candidates are: A::A(const A&)
autoCast.cpp:7: note: A::A(const tm*)
autoCast.cpp:6: note: 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 是一个空指针常量,可以转换为unsigned long 或指针,因此它是不明确的选择。 C++ 标准草案 4.10 Pointer conversions 说(强调我的):

A null pointer constant is an integral constant expression (5.19) prvalue of integer type that evaluates to zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of object pointer or function pointer type.

虽然1 不是空指针常量。虽然 0UL 也可以转换为指针,但它更适合 unsigned long 构造函数,因为不需要转换。

关于c++ - 0 值的自动整数转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21431868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com