Почему неявное преобразование int
в int64_t
vs int
в 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
является long int
на моей машине:
/usr/include/stdint.h
:
# if __WORDSIZE == 64
typedef long int int64_t;
# else
Я подтвердил это с помощью static assert в своем тестовом приложении:
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