c++ - 在类成员内 move 右值

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

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

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

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 。这有可能吗?

最佳答案

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

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

编辑

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

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

关于c++ - 在类成员内 move 右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46767131/

相关文章:

c++ - 使用 reverse_iterator 而不是 const_reverse_iterator 并得到讨厌的编译器警告和错误

c++ - 将指针声明为类成员 C++

c++ - 以下函数的时间复杂度应该是多少?

c++ - 是否有用于解析小数的良好 C++ 工具?

c++ - 如何使用单个 for 循环遍历 std::map<string,int> 和 std::vector<int>?

python - 在pygame中将玩家 move 到鼠标位置

DB2 - 将表从一个表空间 move 到另一个表空间

C# Mysql 将行 move 到另一个表并获取单元格的最大值

c++ - 放弃 auto_ptr 包含对象的所有权

c++ - 不设置 lambda 返回类型时在 std::transform 中的附加拷贝