右值参考模板推导

发布于 2024-12-26 17:19:47 字数 599 浏览 2 评论 0原文

template<class U>
void f( U && v)
{     
    std::cout << typeid(v).name() << "\n"; //'int' in both cases

    if( boost::is_same<int&&,U>::value )
    {
        std::cout << "reach here\n"; //only with f<int&&>(int(1));
    }
}


int main()
{    
    f(int(1));

    f<int&&>(int(1));

    std::cin.ignore();
}

当我没有显式使用 f 时,为什么 v 参数被解释为 int? 有什么区别? (用 MVS2010 编译)

我的猜测是 First 作为右值传递,第二个作为右值引用传递,并且两者都正确绑定到右值引用中,对吗?

谢谢。

template<class U>
void f( U && v)
{     
    std::cout << typeid(v).name() << "\n"; //'int' in both cases

    if( boost::is_same<int&&,U>::value )
    {
        std::cout << "reach here\n"; //only with f<int&&>(int(1));
    }
}


int main()
{    
    f(int(1));

    f<int&&>(int(1));

    std::cin.ignore();
}

Why v parameter is interpreted as int when I don't explicitly use f<int&&>?
What is the difference ? (Compiled with MVS2010)

My guess is that First is passed as a rvalue and second as a rvalue reference and both bound correctly into a rvalue reference, am I right ?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

〃安静 2025-01-02 17:19:48

第一个变体

f(int(1)) <=> f<int>(int(1)) <=> U==int <=> is_same<int&&,int> == false

第二个变体

f<int&&>(int(1)) <=> U==int&& is_same<int&&,int&&> == true

像这样

First variant

f(int(1)) <=> f<int>(int(1)) <=> U==int <=> is_same<int&&,int> == false

Second variant

f<int&&>(int(1)) <=> U==int&& is_same<int&&,int&&> == true

Like this

回忆那么伤 2025-01-02 17:19:47

不,不是真的。永远不会推导出右值引用。概念 U&&(其中 U 是可推导的模板参数)用于指示应该推导 U,使得参数被保留:

  • 当传递 X 类型的右值时,U 的类型变为 X
  • 当传递 X 类型的 cv 限定左值时,U 变为类型 X cv&

更有趣的问题是在第二次调用中显式指定的右值引用发生了什么,因为没有进行任何推导,因为在这种情况下,两个右值引用被折叠为一个。

No, not really. An rvalue reference is never deduced. The notion U&& with U being a deducible template parameter is used to indicate that U should be deduced such that the rvalue-ness of the argument is retained:

  • when passing an rvalue of type X the type of U becomes X.
  • when passing a cv qualified lvalue of type X then U becomes the type X cv&.

The more interesting question is what happened to the rvalue references explicitly specified in the second call because there is no deduction going on because in this case the two rvalue references are collapsed into just one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文