【问题标题】:Function overload resolution with {}使用 {} 解决函数重载问题
【发布时间】:2019-10-28 15:49:52
【问题描述】:

因此,我们的 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++ c++11 overload-resolution list-initialization


    【解决方案1】:

    有没有办法解决这个问题,所以选择我的类的函数重载而不是指针的重载?

    没有明确的演员表。执行隐式转换时,转换为指针的优先级总是高于转换为用户定义类型的优先级。

    【讨论】:

    • 在我可以弃用旧方法之前,必须重新排序参数以避免问题 - 谢谢!
    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多