Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;重载模式:具有可变lambda的调用解析 考虑到这种著名的C++模式: 模板结构重载:Ts。。。{使用Ts::运算符()…;}; 模板重载(Ts…)->重载;//clang需要这个扣除指南, //甚至在C++20中,由于某些原因。。。_C++_C++17 - Fatal编程技术网

C++;重载模式:具有可变lambda的调用解析 考虑到这种著名的C++模式: 模板结构重载:Ts。。。{使用Ts::运算符()…;}; 模板重载(Ts…)->重载;//clang需要这个扣除指南, //甚至在C++20中,由于某些原因。。。

C++;重载模式:具有可变lambda的调用解析 考虑到这种著名的C++模式: 模板结构重载:Ts。。。{使用Ts::运算符()…;}; 模板重载(Ts…)->重载;//clang需要这个扣除指南, //甚至在C++20中,由于某些原因。。。,c++,c++17,C++,C++17,我想知道为什么将其中一个参数声明为可变lambda会改变覆盖分辨率 实例: #包括 模板结构重载:Ts。。。{使用Ts::运算符()…;}; 模板重载(Ts…)->重载;//clang需要这个扣除指南, //甚至在C++20中,由于某些原因。。。 auto main()->int { 自动函子_1=重载{ [](int&){ 标准::可与 您的auto&&闭包不再是const-qualified,这意味着调用它不需要进行const-qualification调整。这使得重载是一个标识精确匹配,而

我想知道为什么将其中一个参数声明为可变lambda会改变覆盖分辨率

实例:

#包括
模板结构重载:Ts。。。{使用Ts::运算符()…;};
模板重载(Ts…)->重载;//clang需要这个扣除指南,
//甚至在C++20中,由于某些原因。。。
auto main()->int
{
自动函子_1=重载{
[](int&){
标准::可与


您的
auto&&
闭包不再是const-qualified,这意味着调用它不需要进行const-qualification调整。这使得重载是一个标识精确匹配,而
int&
重载需要一个const-qualification调整。标识精确匹配击败了一个const-qualification a调整精确匹配per,这就是为什么您会看到调用的
自动&&
版本。

尽管这种模式是众所周知的,但我认为包含一个演绎指南(
模板重载(Ts&&…->重载;
)是有益的,因为没有它,您的代码就无法编译。我猜
void操作符()(int&&)const
模板void运算符(T&&)更不匹配
因为第一个是const?@Fureeish事实上,只有Clang需要我添加到原始问题中的用户定义的演绎指南。这是C++20的一个特性,与C++17相反。有趣的是,你有提出更改的论文的名称吗?谢谢,你是对的。没有注意到constconversion@Guss没问题。它咬了我几次,所以我知道你从哪里来。@Guss fwiw,你观察到的与“正常”一致方法的重载解析:@maximust_prime_是_463035818肯定的。感谢你指出这一点,我完全忘记了在推导符号@Guss时,符号cv限定符比参数隐式转换更强。真的不需要找借口:)我只通过实验发现了这一点,我无法解释为什么没有理由拒绝这个答案
auto functor = overload{
    [](int &&){
        std::cout << "int\n";
    },
    [](auto &&) {
        std::cout << "smthg else\n";
    }
};
functor(42); // prints `int`
auto functor = overload{
    [](int &&){
        std::cout << "int\n";
    },
    [](auto &&) mutable {
        std::cout << "smthg else\n";
    }
};
functor(42); // prints `smthg else`