给定一个 class 对象std::basic_string<char, std::char_traits<char>,my_allocator<char> >
,你如何将它传递给第三方函数,该函数期望对 class 对象的常量引用std::string
而不进行任何复制?
我在想的是,如果我们假设一个无状态分配器,那么理论上,两种类型在运行时应该完全相同。因此,可以简单地重新解释强制转换类型,例如:
// my_allocator template is some place else...
typedef std::basic_string< char, std::char_traits<char>,
my_allocator<char> > my_string;
void third_party_foo(const std::string &s);
int main()
{
const my_string str = "Hello, world!";
third_party_foo(*(const std::string *)&str);
}
给定一个具有状态的分配器(自 C++11 起我们就可以拥有),我认为这要危险得多,因为这些类在运行时的大小和布局可能不同。如果到目前为止我是对的,假设两个类的对象的大小是相同的,在这种情况下,我可以假设分配器状态适合,例如,本来可以填充的某个区域,在这种情况下,第一种方法能行得通。
实际上,我用这种方法将自己置于多少危险之中?是否有任何不携带任何运行时开销的替代方案(当然不需要更改第三方接口和/或放弃带有自定义分配器的字符串)?