我有这个代码:
#include <string>
#include <cstdint>
typedef unsigned long long u64;
struct A{
A(int a) : m_a(a){}
A(u64 a) : m_a(a){}
A(double a) : m_a(a){}
u64 m_a;
};
struct B{
B(int b) : m_b(b){}
B(uint64_t b) : m_b(b){}
B(double b) : m_b(b){}
uint64_t m_b;
};
int main(){
// This works
unsigned long long a = std::stoull("10000");
// And this
auto a2 = A(a);
// And this
auto a3 = A(std::stoull("10000"));
// This works
uint64_t b = std::stoull("10000");
// And this
auto b2 = B(b);
// But not this?
auto b3 = B(std::stoull("10000"));
return 0;
}
Godbolt
为什么Clang和GCC抱怨最后一个例子?难道不应该和第三个例子一样吗?有人能解释一下这是怎么回事吗?C++有哪些特性/规则?
1条答案
按热度按时间ifmq2ha21#
在您正在编译的平台上,
uint64_t
是unsigned long
,而不是unsigned long long
。您可能对https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models感兴趣。
为什么Clang和GCC抱怨最后一个例子?
它们会告诉您原因--调用是模糊的,不清楚选择哪个重载。
难道不应该和第三个例子一样吗?
在第三种情况下,类
A
有一个unsigned long long
重载。在最后一种情况下,类B
没有unsigned long long
重载。