这个构造函数 basic_string<decltype(nullptr)>(char const*) 是做什么的?

问题描述 投票:0回答:1

最近我在读aarch64的一些汇编代码,发现了这个奇怪的构造函数,它似乎没有在basic_string中定义:

_ZNSt4__n112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2B6v15004IDnEEPKc

拆解后的名字是:

std::__n1::basic_string<char, std::__n1::char_traits<char>, std::__n1::allocator<char> >::basic_string[abi:v15004]<decltype(nullptr)>(char const*)

这个函数可能对给定的

this
指针不执行任何操作。

因为在汇编中我发现

x8
寄存器是用来存储指针的,它是由这个函数构造的,并且在
ret
之前被破坏。

但是后来在调用者中,这个x8被用在

operator=(std::string&, std::string&&)
中,看来这会导致use after free错误。

这看起来很奇怪,所以有人能告诉我这个函数是做什么的吗?这个函数只能由编译器生成吗? (意味着用户无法编写此代码)

如果我尝试直接使用它,我会收到此错误:

context.cpp:11:61: error: cannot call constructor ‘std::__cxx11::basic_string<char>::basic_string’ directly [-fpermissive]
   11 |     std::basic_string<char>::basic_string<decltype(nullptr)>(name);
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
c++ string clang arm64 libstdc++
1个回答
0
投票

它是

std::string(nullptr)
的重载,但请注意,从 C++23 开始显式删除此构造函数

https://en.cppreference.com/w/cpp/string/basic_string/basic_string

basic_string( std::nullptr_t ) = delete;   //   (since C++23)
© www.soinside.com 2019 - 2024. All rights reserved.