这是安全的解决方法吗?我想使用 vector bool 值,但需要将指针传递给期待C样式数组的旧代码。

typedef std::basic_string<bool> vector_bool;

int main()
{
    vector_bool ab;
    ab.push_back(true);
    ab.push_back(true);
    ab.push_back(true);
    ab.push_back(false);
    bool *b = &ab[0];
    b[1] = false;
}

编辑:
感谢您提出其他解决方案的建议,但是我真的想对上述解决方案给出确切的答案。谢谢。

最佳答案

我不确定std::basic_string<bool>,因为它将实例化std::char_traits<bool>,并且我不确定标准是否要求定义char_traits,或者是否可以不定义char_traits<char>主模板,仅定义诸如char_traits<bool>这样的显式专门知识。您不能提供自己的bool特化功能,因为只有特化取决于用户定义的类型时,您才可以特化标准模板,而char_traits显然不是。就是说,如果您的stdlib确实具有默认的char_traits定义,并且您不尝试使用要求boolish成员执行任何有用操作的字符串操作,它可能会起作用。

或者,这很hack,但可能会起作用:

struct boolish { bool value; };
inline boolish make_boolish(bool b) { boolish bish = { b }; return bish; }

std::vector<boolish> b;
b.push_back( make_boolish(true) );
bool* ptr = &b.front().value;
boolish是一个琐碎的类型,因此,只要bool数组与static_assert数组具有相同的表示形式(您需要检查编译器,我使用*ptr来检查是否没有填充),那么您可能会得到尽管它可能违反了别名规则,因为*++ptrboolish::value不是同一数组的一部分,所以递增指针不会指向下一个++ptr,它指向前一个的“过去”(即使这些)两个位置实际上具有相同的地址,尽管[basic.compound]/3似乎说bool确实“指向”了下一个make_boolish)。

语法在C++ 11中变得更加容易,您不需要ojit_code ...
#include <vector>
#include <assert.h>

struct boolish { bool value; };

int main()
{
  std::vector<boolish> vec(10);
  vec.push_back( boolish{true} );
  bool* ptr = &vec.front().value;
  assert( ptr[10] == true );
  ptr[3] = true;
  assert( vec[3].value == true );

  static_assert( sizeof(boolish) == sizeof(bool), "" );
  boolish test[10];
  static_assert( sizeof(test) == (sizeof(bool)*10), "" );
}

09-06 22:01