【问题标题】:Moving rvalue inside class member在类成员内移动右值
【发布时间】:2018-03-27 18:52:56
【问题描述】:

我已经浏览了一段时间以寻找答案,但我似乎没有找到它。所以我决定在这里专门问这个问题。

我一直在尝试使用类似的东西(及其变体):

struct NonCopyable
{
    NonCopyable() { };
    NonCopyable(const NonCopyable& other) = delete;
    NonCopyable(NonCopyable&& other) {  };
};

struct Host
{
    Host(NonCopyable&& nc) : m_nc(nc) { }
    NonCopyable m_nc;
};

实现这一目标:

Host h(NonCopyable());

换句话说,我想在 m_nc 中构造 NonCopyable。这有可能吗?

【问题讨论】:

  • 如果你想在m_nc 内部构造NonCopyable 那么为什么要将它作为参数传递(而不是在m_nc 内部构造它...?)
  • 我想从外面注入。你的意思是我应该只传递其构造函数的参数并在Host内部构造它?喜欢:Host(<parameters_for_NonCopyable>) : m_nc(<parameters_for_NonCopyable>)?
  • semicolons after method definitions 上的一些注释。
  • :) 很抱歉。
  • “这可能吗?” 你试过了吗?是什么让你认为这不可能?问题应包括此类详细信息。

标签: c++ c++11 move rvalue most-vexing-parse


【解决方案1】:

注意nc是一个左值作为命名参数,你需要将它转换为右值,例如通过std::move

Host(NonCopyable&& nc) : m_nc(std::move(nc)) { }

编辑

有一个most vexing parse 问题。 Host h(NonCopyable()); 不是变量定义,而是函数声明;它声明了一个名为h 的函数,它返回Host 并接受一个函数指针类型的未命名参数(它什么都不接受并返回NonCopyable)。

只需将其更改为Host h{NonCopyable()};

【讨论】:

  • 是的,也试过了。不想那样发布它以免影响答案。
  • @racanu 你试过了,有什么问题吗?是什么让你认为这是不可能的?
  • 我的意思是即使使用 std::move 它也不能像我想要的那样工作。它可以编译,但我收到警告:warning C4930: 'Host h(NonCopyable (__cdecl *)(void))': prototyped function not called (was a variable definition intended?) 并且没有为实例化行生成代码。
  • 真的吗? Host h(NonCopyable()) 是函数声明?在main() 里面?哇。
  • @racanu 是的,函数声明可以是局部范围的,因此只有发生声明的函数才会知道声明的函数。我不确定这通常是否实用,但这是一个既定的事情。
猜你喜欢
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2011-06-14
  • 1970-01-01
  • 2021-10-26
相关资源
最近更新 更多