【发布时间】:2022-02-17 23:50:17
【问题描述】:
由于我无法理解的非常奇怪的行为,我需要您的帮助。
我写了一个vector.data的简单用法:
void* ptr = NULL; // really initialized somewhere else
bool* boolPtr = NULL;
boolPtr = ((std::vector<bool>*)ptr)->data();
当我编译时(使用 -std=c++17)我得到了错误
void value not ignored as it ought to be
我尝试了很多东西,但似乎每次我从一个强制转换的向量(来自 void*)调用时,data() 方法都会返回一个 void 而不是 bool*。
我错过了什么?
【问题讨论】:
-
A
vector<bool>是一种特殊类型的向量,没有 API 可以获取底层缓冲区。 -
无论何时你在 C++ 中进行 C 风格的强制转换(就像你对
(std::vector<bool>*)ptr所做的那样),你都应该把它当作你在做某事错误的标志! A向量不等同于数组,除了一些向量操作模仿数组的操作。更糟糕的是,std::vector<bool>是一个不同于其他任何std::vector的专业。 -
此外,程序员试图解决此类问题的方法是将那行代码分解为多个语句。
((std::vector<bool>*)ptr)->data();-- 演员是问题吗?是打电话给data()吗?你不知道,因为你在一条线上做多件事。您应该做的是进行强制转换并将其分配给一个变量——查看编译器是否针对该行发出警告/错误。然后获取该变量并使用它来调用data()等。我看到太多的程序员在一行中试图找出问题所在。 -
@PaulMcKenzie 总体来说很好的建议。不幸的是,这不仅仅适用于 C 风格转换的任何情况,因为它告诉编译器“放手,我知道我在做什么!”即使那不是真的(就像这里的情况)。