int element;
(float)element;
cout << typeid(element).name() << endl;
答案 0 :(得分:3)
关于:
int element;
(float)element;
cout << typeid(element).name() << endl;
int element;
告诉编译器使用sizeof (int)
分配存储(并与符号element
关联)。
此外,它会记住类型(在编译时)以供进一步使用变量(作为表达式)。
(float)element;
告诉编译器访问变量element
(类型为int
)并将其值转换为float
(无需进一步处理)。这是从element
而非element
的存储或类型读取的临时值的转换。 – element
仍为int
类型。
回答(部分)问题
有什么办法可以改变变量的类型
不。不允许以此方式更改变量的类型。
关于XY problem(由molbdnilo怀疑):
可以使用new
进行动态分配,为变量“按需”提供存储空间(在运行时)。但是,实际上不建议直接使用new
。如果以后不再需要内存,则用new
分配内容也应delete
。正确处理delete
(禁止两次delete
进行某些操作,但不delete
进行某些操作会导致内存泄漏),维护起来并不容易。
请注意,局部变量(如果未声明为static
或extern
)的生命周期从输入范围开始直到生命周期结束。因此,值得怀疑的是,替代类型的共享存储是否值得。相反,只能使用相应数量的替代局部变量。
但是,可以使用union
或std::variant
(从C ++ 17开始)为变量提供可能的替代类型(一次仅使用一个变量)。
std::variant
的示例:
#include <cassert>
#include <iostream>
#include <variant>
typedef std::variant<int, float> IntOrFloat;
void print(IntOrFloat value)
{
std::cout << "value: ";
if (std::holds_alternative<int>(value)) {
std::cout << std::get<int>(value) << " (int)\n";
} else if (std::holds_alternative<float>(value)) {
std::cout << std::get<float>(value) << " (float)\n";
}
}
int main()
{
IntOrFloat value = 123; // now it's an int
print(value);
value = 1.23f; // now it's a float
print(value);
return 0;
}
输出:
value: 123 (int)
value: 1.23 (float)