想咨询一下大神这里一共调用了几次构造函数,分别都是什么类型的构造函数?有点不是很理解为啥析构了四次?


#include <iostream>
 
std::pair<std::string, std::string> f(std::pair<std::string, std::string> p)
{
    return {p.second, p.first};
}
 
int main()
{
   std::cout << f({"hello", "world"}).first << "\n";
}

汇编如下

call  	std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> > >::pair<char const (&) [6], char const (&) [6], true>(char 
        const (&) [6], char const (&) [6])
lea     rax, [rbp-144]
lea     rdx, [rbp-80]
mov     rsi, rdx
mov     rdi, rax
call    f(std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> > >)
lea     rax, [rbp-144]
mov     rsi, rax
mov     edi, OFFSET FLAT:_ZSt4cout
call    std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, 
        std::char_traits<char>, std::allocator<char> (std::basic_ostream<char, 
        std::char_traits<char> >&, std::__cxx11::basic_string<char, 
        std::char_traits<char>, std::allocator<char> > const&)
mov     esi, OFFSET FLAT:.LC2
mov     rdi, rax
call    std::basic_ostream<char, std::char_traits<char> >& std::operator<< 
         <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, 
         char const*)
lea     rax, [rbp-144]
mov     rdi, rax
call    std::pair<std::__cxx11::basic_string<char,std::char_traits<char>,
        std::allocator<char> >, 										 
        std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > 
        >::~pair() [complete object destructor]
lea     rax, [rbp-80]
mov     rdi, rax
call    std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> > >::~pair() [complete object destructor]
mov     eax, 0
jmp     .L21
mov     rbx, rax
lea     rax, [rbp-144]
mov     rdi, rax
call    std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> > >::~pair() [complete object destructor]
jmp     .L18
mov     rbx, rax
.L18:
lea     rax, [rbp-80]
mov     rdi, rax
call    std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, 
        std::allocator<char> > >::~pair() [complete object destructor]
mov     rax, rbx
mov     rdi, rax
call    _Unwind_Resume

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

有拷贝构造函数,构造函数

传递对象就要调用拷贝构造函数 指针和引用就不会