【问题标题】:C++ move constructor for a class with string member具有字符串成员的类的 C++ 移动构造函数
【发布时间】:2021-12-23 00:00:07
【问题描述】:

我用以下代码编写了一个类:

class Test {
public:
...
    Test( const Test &&that ) : i(that.i), s(std::move(that.s)) {
        cout << "move contructor." << endl;
    }
...
private:
    int i;
    std::string s;
};

如果我反汇编我看到的生成代码:

        .type   Test::Test(Test const&&), @function
Test::Test(Test const&&):
...
       call    std::remove_reference<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>::type&& std::move<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
        movq    %rax, %rsi
        movq    %rbx, %rdi
.LEHB3:
        call    std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@PLT

basic_string&lt;...&gt;::basic_string( basic_string&lt;...&gt; const&amp;) 的调用让我感到惊讶,因为我希望调用basic_string basic_string&lt;...&gt;::basic_string( basic_string&lt;...&gt; &amp;&amp;) 的移动构造函数。

我以不正确的方式实现移动构造函数?

【问题讨论】:

  • 你用的是什么编译器?这是代码的调试版本还是发布版本?
  • @HajoKirchhoff: g++ 9.3.0

标签: c++ move-semantics


【解决方案1】:

对 const 类型的右值引用不是很有用。他们说代码可以从对象中窃取,但必须在不改变其值的情况下这样做?

由于std::string 没有string(const string&amp;&amp;) 移动构造函数,重载解析只能使用string(const string&amp;) 复制构造函数。

普通的移动构造函数不使用const

Test( Test &&that ) : i(that.i), s(std::move(that.s)) {
    std::cout << "move constructor." << std::endl;
}

【讨论】:

  • 我的错误,谢谢。删除了 const 并且汇编器现在是预期的。注意:将他的参数限制为非 const 可能是一个不错的举措。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2015-05-25
  • 1970-01-01
  • 2014-04-15
  • 2020-04-06
  • 2016-08-16
相关资源
最近更新 更多