【问题标题】:Does something wrong with Widget&& var1 = someWidget;?Widget&& var1 = someWidget; 有问题吗?
【发布时间】:2022-01-20 01:33:12
【问题描述】:

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

【问题讨论】:

  • "可以右值引用接受左值"。不,someWidget 只是一个占位符。更好的例子可能是= getSomeWidget(),该函数/占位符可能返回正确的类型。
  • so someWidget 不是一些已经存在的 Widget 变量的名称

标签: c++ reference rvalue-reference universal


【解决方案1】:

我发现那篇博文令人困惑。我建议阅读一本书或标准本身的好章节,而不是那篇文章。部分问题在于博客文章已有 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;
}

【讨论】:

    猜你喜欢
    • 2023-01-17
    • 2011-04-28
    • 2022-01-14
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多