手动选择不明确的构造函数

Selecting ambiguous constructor manually

当函数调用(成员 class 函数或自由函数)不明确时,我们可以 select 轻松使用 static_cast<> 我们调用的函数类型:

struct S {
    void f(uint32_t, uint8_t) {
        std::cout << "1\n";
    }

    void f(uint32_t, uint32_t) {
        std::cout << "2\n";
    }
};

int main() {
    S s;
    auto f1 = static_cast<void(S::*)(uint32_t, uint8_t)>(&S::f);
    (s.*f1)(1,1);
    auto f2 = static_cast<void(S::*)(uint32_t, uint32_t)>(&S::f);
    (s.*f2)(1,1);
}

但我想知道是否可以为构造函数做类似的事情。例如,在以下结构中:

struct S {
    S(uint32_t, uint8_t) {
        std::cout << "1\n";
    }

    S(uint32_t, uint32_t) {
        std::cout << "2\n";
    }
};

是否可以手动解决创建 S s(1,1); 的模糊构造函数调用?

这是你想要的吗?

S s1(static_cast<uint32_t>(1), static_cast<uint32_t>(2));
S s2(static_cast<uint32_t>(1), static_cast<uint8_t>(2));

这通过在参数中明确指定类型来消除构造函数调用的歧义。

为什么不转换为正确的类型? 1 是一个 int 文字,因此在传递给无符号参数时会造成一些“混淆”

int main() {
    S s;
    s.f(1, (uint8_t)1);
    s.f(1, (uint32_t)1);
    s.f(1, 1U);
}

Demo on Godlbolt