gpt4 book ai didi

c++ - 右值引用——我失去了值(value)

转载 作者:行者123 更新时间:2023-11-28 02:43:39 25 4
gpt4 key购买 nike

我对右值引用有点困惑,所以我尝试了以下代码:

std::vector<char> stringToChar(std::string& str)
{
std::vector<char> rep(str.begin(), str.end());
return rep;
}

std::vector<char>& cryptPassword(std::vector<char>&& password)
{
// static const char _key = 56; //crypt password
// for (char &c : password)
// c = c ^ _key;
return (password);
}

std::vector<char>& stringToPassword(std::string& str)
{
return cryptPassword(stringToChar(str));
}

在第一种情况下我得到了正确的输出,但在第二种情况下我得到了垃圾。

std::string str("Hello");
std::vector<char> tmp = cryptPassword(stringToChar(str));

//correct output
for (char c : tmp)
std::cout << c;
std::cout << std::endl;

//garbage
tmp = stringToPassword(str);
for (char c : tmp)
std::cout << c;
std::cout << std::endl;

最佳答案

stringToChar(str) 的结果是一个右值,它将绑定(bind)到 cryptPassword() 获取的右值引用。当返回 password 时, vector 被复制并绑定(bind)到引用(cryptPassword() 返回一个左值引用)。问题在于返回值是一个临时拷贝,该拷贝在调用 temp = stringToPassword() 后已失效。使用它是未定义的行为。

不是返回引用,而是按值返回和 std::move() password out:

std::vector<char> cryptPassword(std::vector<char>&& password)
{
// ...
return std::move(password);
}

关于c++ - 右值引用——我失去了值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100563/

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