gpt4 book ai didi

c++ - 使用 {} 的函数重载解析

转载 作者:行者123 更新时间:2023-12-03 12:20:21 30 4
gpt4 key购买 nike

因此,我们的 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 似乎还有某种编译器特例。使其行为与我的类(class)和 std::vector 不同.有没有办法解决这个问题,所以选择我的类的函数重载而不是指针的函数重载?

最佳答案

Is there any way of working around this so the function overload taking my class is chosen over the one taking the pointer?



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

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com