gpt4 book ai didi

c++ - 模板中右值引用和 const 左值引用之间的重载

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:35 24 4
gpt4 key购买 nike

我想根据参数是否为临时对象来重载两个函数,所以我这样写代码:

#include <iostream>

void f(int &&)
{
std::cout << "&&" << std::endl;
}

void f(const int&)
{
std::cout << "const &" << std::endl;
}

int main()
{
int i;
f(i);
f(i + 1);
}

它正确地输出:

const &
&&

但是,当我更改代码以使用这样的模板时:

#include <iostream>

template <typename T>
void f(T &&)
{
std::cout << "&&" << std::endl;
}

template <typename T>
void f(const T&)
{
std::cout << "const &" << std::endl;
}

int main()
{
int i;
f(i);
f(i + 1);
}

输出变为:

&&
&&

有什么问题?使用模板时如何针对可移动的临时对象进行优化?

编辑:

其实这是我看C++ Primer时的测试代码。它说:

template <typename T> void f(T&&);       // binds to nonconst rvalues
template <typename T> void f(const T&); // lvalues and const rvalues

经过我的实验,书上好像错了。

最佳答案

template <typename T>
void f(T &&)
{
std::cout << "&&" << std::endl;
}

使用 universal 转发引用 并允许任何具有引用折叠的类型。

在将代码包装到结构中时,您必须使用没有推导上下文的 T:

template <typename T>
struct helper
{

void f(T &&)
{
std::cout << "&&" << std::endl;
}

void f(const T&)
{
std::cout << "const &" << std::endl;
}

};

template <typename T>
void f(T &&t)
{
helper<typename std::decay<T>::type>().f(std::forward<T>(t));
}

Live example

关于c++ - 模板中右值引用和 const 左值引用之间的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27835925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com