为什么Clang和GCC抱怨这种特定情况

hc8w905p  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(117)

我有这个代码:

#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++有哪些特性/规则?

ifmq2ha2

ifmq2ha21#

在您正在编译的平台上,uint64_tunsigned 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重载。

相关问题