gpt4 book ai didi

c++ - 右值引用的错误转发

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

我正在试验新添加的右值引用(在 vs2012 express 中)。

我有点不明白。给出下面的代码(大部分代码取自解释了 std::forward 的 c++ 标准)。

struct A
{
A(int& i, const float& j):
m_i(i),
m_j(j){}

int& m_i;
const float& m_j;
};

template<class T, class A1, class A2>
T* factory(A1&& a1, A2&& a2)
{
return new T(a1, a2);
}

void test()
{

A* a1 = factory<A>(1, 1.2f);

//How does this work ?
a1->m_i = 2;
}

我不明白 m_i 绑定(bind)到哪里。

我基本上会有一个左值引用到右值引用 (& &&),通过 ref 折叠规则变成 (&) 只是一个普通的左值引用。但是引用什么?

最佳答案

I don't understand where is m_i binded to.

m_i绑定(bind)到 A 的参数的构造函数。 A 的参数是什么?的构造函数在这里?

在这种情况下,由于 factory 将其参数转发给A (即它不使用 std::forward<>() ),然后传递给 A 的内容是一个左值。这是因为 a1命名的命名的对象是左值

a1类型与确定是否a1无关是左值或右值。所以即使a1具有类型rvalue-reference to int ( int&& ),就像您的程序中的情况一样,参数 a1本身是一个命名对象,因此它是一个左值。

这意味着,自 m_i具有对 int 的左值引用类型, 那m_i 可以绑定(bind)(并且确实绑定(bind))到factory的(左值)参数 a1 , 将在 factory() 时销毁返回。换句话说,您留下了悬空引用。

尝试取消引用它(就像您稍后在程序中所做的那样)会引发未定义的行为

但是,如果您的 factory()函数已将其参数转发A的构造函数:

template<class T, class A1, class A2>
T* factory(A1&& a1, A2&& a2)
{
return new T(std::forward<A1>(a1), std::forward<A2>(a2));
}

这会导致编译器错误,因为 std::forward<>() 的机器将确保左值保持左值,右值保持右值。尝试将左值引用绑定(bind)到右值是非法的,因此对 A 的调用的构造函数会失败。

关于c++ - 右值引用的错误转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15968752/

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