c++ - 使用自定义分配器引用字符串的 std::basic_string 特化作为 std::string 的常量对象而无需开销?

标签 c++ c++11 stl casting

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

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

最佳答案

你不知道。通过使用自定义分配器,您将使用与 std::string不同的类型。 C++ 中没有(合法的)方法可以在没有拷贝的情况下转换它。 C++ 标准不会保证您认为可能工作的任何内容。

所以你必须接受你需要一份拷贝。

关于c++ - 使用自定义分配器引用字符串的 std::basic_string 特化作为 std::string 的常量对象而无需开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16321531/

相关文章:

c++ - 在变量返回之前存储值

c++ - operator bool() 转换为 std::string 并与 operator std::string() 冲突

linux - 在 Linux 上使用 C++14 并发布针对不同 Linux 版本的二进制文件

c++ - 使用带接口(interface)的 CRTP

C++按值而不是按位置删除 vector 元素?

c++ - 如何从 Windows 快捷方式(.lnk 文件)以编程方式 (C++) 启动应用程序?

c++ - '初始化' : cannot convert from 'zallocator<char>' to 'zallocator<U>'

c++ - 如果使用 Makefile 编译,代码可以正常工作,如果使用 XCode 编译,代码会崩溃

c++ - 使仿函数成为类成员函数时出现编译错误

c++ - 从 std::istreambuf_iterator 创建 std::string,奇怪的语法怪癖