1

给定一个 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 起我们就可以拥有),我认为这要危险得多,因为这些类在运行时的大小和布局可能不同。如果到目前为止我是对的,假设两个类的对象的大小是相同的,在这种情况下,我可以假设分配器状态适合,例如,本来可以填充的某个区域,在这种情况下,第一种方法能行得通。

实际上,我用这种方法将自己置于多少危险之中?是否有任何不携带任何运行时开销的替代方案(当然不需要更改第三方接口和/或放弃带有自定义分配器的字符串)?

4

1 回答 1

4

你没有。通过使用自定义分配器,您使用的类型std::string. 在 C++ 中没有(合法的)方法可以在没有副本的情况下进行转换。C++ 标准不保证任何您认为可能有效的东西。

所以你必须接受你需要一份副本。

于 2013-05-01T15:52:24.593 回答