![]() |
1
5
我不知道你为什么这么想。转发就是这样:移动或复制
1)
. 在示例中,创建一个临时
如果要构造
创建就地构造函数:
然后这样称呼它:
就另一个答案发表意见:
在这方面,一个系数绝对没有什么特别之处。使用简单的自由函数可以看到完全相同的行为:
上面的示例与您的操作类似。您可以看到
为了理解为什么不能直接在
总结一下答案:基本上,prvalue表达式并不具体化对象,而是可以初始化对象。在使用表达式初始化对象之前,请尽可能长时间地保存该表达式(这样可以避免一些复制/移动)。请参阅链接的答案,以获得更深入而友好的解释。
使用表达式初始化
如果我们稍微修改一下我的示例,我们可以看到工作中有保证的副本删除:
如果没有省略,事情会是这样的:
现在用C++ 17保证拷贝删除
其余的现在是一样的:
你需要理解的是:一旦你命名了某件事,那件事
必须
存在。令人惊讶的简单原因是,一旦你有了某个东西的名字,你可以多次引用它。看看我的答案
other question
. 您已将参数命名为
如果你想使用C++ 17保证拷贝删除,你不喜欢就地方法,你需要避免命名事物:)你可以用lambda来做。我经常看到的习惯用法,包括在标准中,都是现成的。因为我在野外还没有见过lambda,所以我不知道是否会推荐它。不管怎样,这里是:
在C++ 17中,它不授予拷贝和/或移动,即使它工作。
1)
我说的是转发成语,如果使用得当。
|
![]() |
2
0
引用(左值引用或右值引用)必须绑定到对象,因此当引用参数
从技术上讲,要消除这种移动,编译器必须同时知道初始值设定项参数和构造函数的定义。这是不可能的,因为它们可能位于不同的翻译单元中。 |