如果我使用`std :: byte`s,如何使用期望`const char *`的接口

时间:2017-12-27 18:44:34

标签: c++ c++17

使用C ++ 17添加了std::byte。但是,所有这些遗留接口都期望const char*为一个字节数组(例如,libpng)。如果我在代码中将字节表示为std::byte个对象的容器(例如,std::vector<std::byte>),我该如何使用这些接口?

2 个答案:

答案 0 :(得分:2)

给定std::byte s的连续缓冲区,将std::byte*重新解释为char*是合法的,并且不违反严格的别名规则:

wording from the most recent revision of the std::byte proposal

  

左值和右值[basic.lval]

     
      
  1. 如果程序试图通过以下类型之一以外的glvalue访问对象的存储值,则行为未定义:

         
        
    • [...]

    •   
    • (8.8)charunsigned charstd::byte类型。

    •   
  2.   

(注意:&#34;或std::byte&#34;由提案添加)

因此,您可以使用reinterpret_cast<const char*>(pointer_to_std_byte_buffer)static_cast<const char*>(static_cast<const void*>(pointer_to_std_byte_buffer))(const char*)pointer_to_std_byte_buffer,具体取决于您的风格指南所说的内容。

答案 1 :(得分:0)

如果你坚持使用std :: byte,你必须在传递给期望元素为char的东西时进行强制转换:

(char const *)&myVec[0]