【发布时间】:2015-05-22 01:23:18
【问题描述】:
我真的不知道如何描述这个问题,但我有一个模板类,它存储一个值数组并将其转换为各种数据类型。一般来说,我不会将布尔值转换为浮点数,但由于模板的工作方式,它必须实现。
这会导致一个奇怪的问题,当 T[] = bool[] 时,我在此代码上收到错误:
virtual bool getBool(uint i) {
bool b;
b = *reinterpret_cast<bool*>(&values[i]);
return b;
}
编译器错误:
error: taking address of temporary
但这编译并工作正常:
virtual bool getBool(uint i) {
bool b;
T c = values[i];
b = *reinterpret_cast<bool*>(&c);
return b;
}
这两段代码的工作方式完全相同,但当 T 为 bool 时,第一段代码将无法编译。 int、float 和 std::string 在此代码的两个版本中都按预期工作。 (gcc c++11)
为什么会这样?
【问题讨论】:
-
“数组”是 std::vector 吗? (如果是这样, std::vector
是特殊的) -
是的。它有什么特别之处?
-
This is。如果您的意思是
std::vector,请不要说数组。 -
下次请提供一个最小的完整测试用例。它避免了这样的问题,即您遗漏了关键细节而没有意识到它们是至关重要的。
-
你有一个类模板来存储任意类型的数组
T,并且你有一个成员函数getBool,无论T是bool,它都将reinterpret_cast?!似乎是一个很棒的主意。