因此,我们的C++库允许用户使用可变参数构造函数传递包装在类中的值列表,以便可以在编译时检查这些列表的长度。我试图通过添加新的重载函数来添加一些新功能。但是,当我传递参数的零长度数组时,将调用``错误''重载。 {}。以下最小示例说明了此问题:

#include <iostream>
#include <vector>

class EmptyList
{
public:
    template<typename... T>
    EmptyList(T&&... vals)
    {
        static_assert(sizeof...(vals) == 0, "Wrong number of values");
    }

    std::vector<double> getValues() const { return {}; }
};

void testVector(int *a, std::vector<double> b)
{
    std::cout << "Vector: A (" << a << ")" << std::endl;
}

void testVector(std::vector<double> a, std::vector<double> b)
{
    std::cout << "Vector: B" << std::endl;
}

void testInitList(int *a, std::initializer_list<double> b)
{
    std::cout << "Init list: A (" << a << ")" << std::endl;
}

void testInitList(std::initializer_list<double> a, std::initializer_list<double> b)
{
    std::cout << "Init list: B" << std::endl;
}

void testEmptyList(int *a, const EmptyList &b)
{
    std::cout << "Empty list: A (" << a << ")" << std::endl;
}

void testEmptyList(const EmptyList &a, const EmptyList &b)
{
    std::cout << "Empty list: B" << std::endl;
}

int main()
{
    testVector({}, {});
    testInitList({}, {});
    testEmptyList({}, {});
}

输出为:
Vector: A (0)
Init list: B
Empty list: A (0)

重载行为不仅看起来很奇怪,而且std::initializer_list似乎有某种编译器特殊情况,使其行为与我的类和std::vector不同。有什么办法可以解决这个问题,所以选择函数重载来选择我的类,而不是选择使用指针的那一种?

最佳答案



并非没有明确的类型转换。当执行隐式转换时,始终比使用用户定义的类型优先向指针进行转换。

关于c++ - 使用{}的函数重载解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58594123/

10-11 22:39
查看更多