给定类std::basic_string<char, std::char_traits<char>,my_allocator<char> >
的对象,如何将它传递给第三方函数,该函数需要对类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开始),我认为这更危险,因为运行时这些类的大小和布局可能不同。如果我到目前为止是正确的,那么让我们说两个类的对象的大小是相同的,在这种情况下,我可以假设分配器状态适合于某些本来可以填充的区域,在这种情况下,第一种方法可以工作。
实际上,我用这种方法将自己置于危险之中?是否存在任何不带任何运行时开销的替代方案(当然不需要更改第三方接口和/或放弃使用自定义分配器的字符串)?
答案 0 :(得分:4)
你没有。通过使用自定义分配器,您使用std::string
中的不同类型。并且在C ++中没有(合法的)方式来转换它而没有副本。您认为可能工作的任何内容都不会得到C ++标准的保证。
所以你必须接受你需要一份副本。