Widget&& var1 = someWidget; 有问题吗?

Does something wrong with Widget&& var1 = someWidget;?

最近,我开始学习一些关于通用参考 https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers 的东西,它说 Widget&& var1 = someWidget; //here, "&&" means rvalue reference。我知道“&&”可以是通用引用也可以是右值引用,但我认为somewidget一定是左值,这里没有推导,所以Widget&& &&一定是右值引用,这里是题。右值引用可以接受左值吗,我了解到左值引用可以接受左值,const左值引用可以接受右值,但是右值引用只能接受右值,所以这个说法有问题吗?或者我想念的东西

我发现博客 post 令人困惑。我建议阅读一本书中的一个很好的章节或标准本身,而不是 post。部分问题在于博客 post 已有 10 年历史,因此人们仍在思考新功能以及如何教授它们。我不认为该代码甚至可以编译。我测试了 int a = 5; int &&b = a; 并得到了预期的编译时错误。我认为他的意思类似于 widget{} by someWidgetint &&j = int{5}; 编译正常。

但是,如果您有像 void f(T &&t) 这样的模板函数,它可以变成左值引用或右值引用,具体取决于传递给它的内容。其要点是实现完美转发。这样做的旧方法是计算所有可能的参数组合,这是采用的参数数量的指数。现在,您可以编写一个可以尽可能高效地调用其他函数的函数,使用如果某物是一个右值这一事实。考虑以下示例:

struct W
{
   W(int &, int &) {}
};

struct X
{
   X(int const &, int &) {}
};

struct Y
{
   Y(int &, int const &) {}
};

struct Z
{
   Z(int const &, int const &) {}
};

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

int main()
{
   int a = 4;
   int b = 5;
   W *pw = factory<W>(a, b);
   X *px = factory<X>(2, b);
   Y *py = factory<Y>(a, 2);
   Z *pz = factory<Z>(2, 2);

   delete pw;
   delete px;
   delete py;
   delete pz;
}