使用{}解析函数重载
Function overload resolution with {}
因此,我们的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
都不同。有没有办法解决这个问题,这样就可以选择占用我类的函数重载而不是占用指针的函数重载?
有没有办法解决这个问题,这样就可以选择占用我类的函数重载而不是占用指针的函数重载?
没有显式强制转换。执行隐式转换时,对指针的转换将始终比对用户定义的类型的转换具有更高的优先级。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载