在std :: vector <bool>上调用data()时会发生什么?

Nar*_*oot 34 c++ stl c++11

C++ 11已经实现了data()成员函数on std::vector,它为你提供了一个指向内存数组的指针.这是否意味着模板专业化std::vector<bool>也有这个成员?由于此专业化不会存储数据,bool *您可以通过调用期望什么样的行为data()

Mik*_*our 28

它不会编译,除非您的实现具有非标准扩展.如std::vector<bool>C++ 11 23.3.7/1中所规定的,特殊化并未声明data成员.

  • 我试图做到这一点,我得到的`gcc`错误是`data`是一个"不应该忽略的void值",这意味着函数已经实现,但是有一个`void`返回类型.这很好奇. (4认同)
  • @MatsPetersson:确实很好奇。GCC 定义了一个 void 函数,带有一个神秘的注释:“由于我们在调试模式向量类中实现 DR 464 的方式,我们在这里需要一些东西”(DR 464 是建议将 `data()` 添加到通用 `矢量`模板)。 (3认同)

did*_*erc 26

页面明确地记录了该类,表明该专业化不提供此方法.

专门化具有与非专用向量相同的成员函数,除了data,emplace和emplace_back之外,在此专门化中不存在.

这个其他页面以及C++规范的 §23.3.7 确实证实了这一点.

  • 永远不要相信cplusplus.com (8认同)
  • C++ 11 23.3.7表示相同的东西,可能更感兴趣;) (6认同)
  • @Yakk:那个页面有什么问题吗,或者你只是跟着我在那里看到的不明原因的仇恨? (5认同)
  • @MikeSeymour:"讨厌"可能与可疑信息有关,例如[本页]上的`while(myfile.good())`示例(http://www.cplusplus.com/doc/tutorial/files/ ).当我输入这个时,新手程序员[使用这种不良做法](http://stackoverflow.com/questions/16569651/eof-bad-good-functions-arent-detected-by-autocomplete). (3认同)
  • @Blastfurnace:公平点; 我希望所有人都被重定向到cppreference,而不是按照[这个例子](http://en.cppreference.com/w/cpp/thread/mutex/try_lock)解锁你可能不拥有的锁.道德:永远不要相信互联网. (2认同)
  • @MikeSeymour cppreference是一个开放的wiki,依赖于读者提供修复和内容.只是在谈话页面上提出一个问题就会引起注意. (2认同)