gpt4 book ai didi

c++ - R 值和 L 值的输出不同。为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:16:16 25 4
gpt4 key购买 nike

有人可以向我解释为什么 R 值的输出与 L 值的输出不同吗?

#include <iostream>
#include <vector>
using namespace std;

template<typename Ct>
struct ct_wrapper {
Ct&& ct; // R or L ref
explicit ct_wrapper(Ct&& ct)
: ct(std::forward<Ct>(ct)) { std::cout << this->ct[1];};
};

int main() {

// L-val
vector<int> v{1,2,3};
ct_wrapper<vector<int>&> lv(v);
cout << endl << lv.ct[0] << lv.ct[1] << lv.ct[2] << endl;

// R-val
ct_wrapper<vector<int>&&> rv(vector<int>{1,2,3});
cout << endl << rv.ct[0] << rv.ct[1] << rv.ct[2] << endl;
}

输出(gcc48 和 clang32 相同):

2
123
2
003

回答

它在我与 Johannes Schaub 的聊天中被埋没了,所以我把它放在这里。

当临时 vector 初始化 r-value-ref 成员变量 rv.ct 时,临时生命周期没有延长,因为有一个特殊的异常:[class.temporary]p5: "A temporary bound to a构造函数的 ctor-initializer (12.6.2) 中的引用成员一直存在,直到构造函数退出。”

最佳答案

因为您的成员(member)只是一个引用。在第二种情况下,它引用的对象在本地 rv 变量定义完成后就已经死了。因此 cout 中的后续访问是未定义的行为。

关于c++ - R 值和 L 值的输出不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12226567/

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