为什么是隐式转换int
to int64_t
vs int
to double
模糊的?
我本以为积分重载会优先于浮点积分?
#include <stdint.h>
void foo(double) {}
void foo(int64_t) {}
int main()
{
foo(5);
return 0;
}
main.cpp: In function ‘int main()’:
main.cpp:8:10: error: call of overloaded ‘foo(int)’ is ambiguous
foo(5);
^
main.cpp:3:6: note: candidate: void foo(double)
void foo(double) {}
^
main.cpp:4:6: note: candidate: void foo(int64_t)
void foo(int64_t) {}
^
我的环境是:
- x86_64
- g++-5.4(与
-std=c++14
)
int64_t
is a long int
在我的机器上:
/usr/include/stdint.h
:
# if __WORDSIZE == 64
typedef long int int64_t;
# else
我已经在我的测试应用程序中使用静态断言确认了这一点:
static_assert(__WORDSIZE == 64, "");
static_assert(std::is_same<int64_t, long int>::value, "");
我的构建标志是:
-std=c++14 -Werror -Wall -Wextra -m64 -msse2 -msse4.2 -mfpmath=sse
-ftemplate-depth-128 -Wno-unused-parameter -pthread -g -ggdb3 -O0 -fno-inline
从 [over.ics.user] 表 12 我们有
正如您所看到的,整数和浮点提升具有相同的排名,整数和浮点转换具有相同的排名。
现在我们需要确定是否5 -> int64_t
是整数提升或转换。如果我们检查 [conv.prom]/1 我们发现
如果 int 可以表示源类型的所有值,则除 bool、char16_t、char32_t 或 wchar_t 之外的整数类型的纯右值(其整数转换等级 (4.13) 小于 int 的等级)可以转换为 int 类型的纯右值;否则,可以将源纯右值转换为 unsigned int 类型的纯右值。
促销活动停止于int
所以我们必须看一下 [conv.integral]/1 这是整数转换,我们有
整数类型的纯右值可以转换为另一种整数类型的纯右值。无作用域枚举类型的纯右值可以转换为整数类型的纯右值。
这就是正在发生的事情。所以5 -> int64_t
是整数转换并且5 -> double
是浮点转换,两者的排名相同,因此重载分辨率不明确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)