继承函数的重载解析
Overload resolution for inherited functions
我想要一个结构,它接受任意数量的lambda,并作为所有调用运算符的中心调用点。
如果调用调用运算符时使用的参数列表与构造中给定的任何lambda都不匹配,则应调用默认调用运算符。
我原以为下面的代码就能做到这一点。每个lambda的调用运算符都通过using
"提升"到Poc
类中。
template <typename ...Lambdas>
struct Poc : Lambdas...
{
using Lambdas::operator() ...; // Lift the lambda operators into the class
template <typename ...Ts>
auto operator() (Ts...)
{
std::cout << "general call" << std::endl;
}
};
// Deduction guide
template <typename ...Ts>
Poc(Ts... ts)->Poc<Ts...>;
int main()
{
auto l_int = [](int) {std::cout << "int" << std::endl; };
Poc poc{l_int};
poc(1);//calls the default operator. why?
return 0;
}
当结构中没有默认的调用运算符时,一切都会按预期进行(使用有效的参数列表(。如果我将它添加到结构中(如上面的代码中所示(,那么无论我用哪个参数调用它,每次都会调用默认运算符。
根据我的理解,lambda调用运算符和structs(默认(调用运算符存在于同一范围内。因此,它们都应该考虑过载解决方案。由于lamdba运算符比一般默认运算符更具体,因此应该选择它。
显然情况并非如此。为什么?
我在Microsoft Visual C++、Clang和GCC(都是最新版本(上进行了测试。
编辑:
- MSVC 15.8.9
- GCC 9.0.0(通过Wandbox(
- Clang 8.0.0(通过Wandbox(
发现它很简单:您的运算符不是const
限定的,而lambda的运算符是(除非您将lambda定义为mutable
(。因此,它与Poc
的非常数实例更匹配。
只需添加缺失的const
:
auto operator() (Ts...) const
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?