当两者同等匹配时,函数绑定到第二个模板而不是通用引用[重复]

问题描述 投票:0回答:1

这里

i
是一个bitfied。所以我必须添加 const as 有问题 .

现在它打印左值。

  1. 为什么当通用引用更匹配时它会打印左值 ?

  2. 这是否意味着我们有左值引用匹配和右值引用匹配 左值引用匹配总是被选择?

    #include<bits/stdc++.h>
    using namespace std;
    
    template<typename T> void f(const T&& obj){ cout <<"rvalue\n"; }
    template<typename T> void f(const T& obj){ cout <<"lvalue\n"; }
    
    struct S {
        int i:31;
        int j;
    };
    int main()
    {
        S s;
        f(s.i);
    }
    
  3. 下面我们从 f(T&& obj) 中删除 const 并将右值打印为 预期的,因为两者是匹配且通用的参考 优先事项。这是正确的吗?

    #include<bits/stdc++.h>
    using namespace std;
    
    /* this is not constant . It is T&& instead of const T&& */
    template<typename T> void f(T&& obj){ cout <<"rvalue\n"; }
    template<typename T> void f(const T& obj){ cout <<"lvalue\n"; }
    
    struct S {
        int i:31;
        int j;
    };
    int main()
    {
        S s;
        f(s.j);
    }
    
c++ c++11 templates c++17 c++14
1个回答
1
投票

原因是

const T&&
不是转发参考(Scott 所说的“通用参考”的官方术语)。来自cppreference

转发引用是一种特殊的引用,它保留函数参数的值类别,从而可以通过 std::forward 转发它。转发参考是:

  1. 函数模板的函数参数声明为对同一函数模板的 cv 非限定类型模板参数的右值引用:[...]

const T&&
不是“简历不合格”,因此不是转发参考。在第二个示例中
f(T&& obj)
T
是转发参考。

© www.soinside.com 2019 - 2024. All rights reserved.