gpt4 book ai didi

c++ - "auto v = f()"和 "auto&& v = f()"有什么区别?

转载 作者:行者123 更新时间:2023-11-30 01:08:29 24 4
gpt4 key购买 nike

#include <vector>

using namespace std;

vector<int> f()
{
return{};
}

// Update: Below is not compilable
void g(vector<int>)
{}

// Update: Below is the my initial intent.
/*
void g(const vector<int>&)
{}
*/

void g(vector<int>&&)
{}

int main()
{
auto v1 = f();
auto&& v2 = f();

g(forward<vector<int>>(v1));
g(forward<vector<int>>(v2));
}

C++11 是否保证 g(forward<vector<int>>(v1))会调用f(vector<int>)f(const vector<int>&)g(forward<vector<int>>(v2))会调用f(vector<int>&&)

最佳答案

区别在于 v1 是一个 vector ,而 v2 是一个 vector 的右值引用。

按照您的方式重载 g 是一个非常糟糕的主意。如果参数是一个 cv 非限定右值,那么调用将是不明确的,因为 g 都可以接受带有身份转换序列的右值。但是,一个重载采用 T& 而另一个采用 T&& 是可以接受的。

如果要转发f() 的值类别,请不要像在v1 中那样复制/移动它。这会破坏值类别信息。 v1 将始终是左值。

此外,您没有正确使用 std::forwardv1v2 都将被转换为右值引用,并且在这种情况下在重载决策下的行为方式相同。

下面是 std::forward 的正确用法:

void g(vector<int>&);
void g(vector<int>&&);
int main() {
auto&& v1 = function_returning_lvalue_vector();
auto&& v2 = function_returning_rvalue_vector();
g(forward<decltype(v1)>(v1)); // calls lvalue overload
g(forward<decltype(v2)>(v2)); // calls rvalue overload
}

关于c++ - "auto v = f()"和 "auto&& v = f()"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42476024/

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