是否有任何方法可以在初始化之前更改变量的类型,您可以用示例解释
Is there any way to change the type of the variable before initialization can you explain with an example?
int element;
(float)element;
cout << typeid(element).name() << endl;
有关:
int element;
(float)element;
cout << typeid(element).name() << endl;
int element;
告诉编译器与sizeof (int)
分配存储(并将其与符号element
相关联)。
此外,它还记得(在编译时间)的类型(在编译时),以进一步使用该变量(作为表达式)。
(float)element;
告诉编译器访问变量element
(它是类型int
),并将其值转换为float
(无需进一步处理)。这是从element
而非element
S存储或类型中读取的临时值的转换。&ndash;element
仍然是int
类型。
回答(一部分)问题
是否有任何方法可以更改变量的类型
否。不允许这样更改变量的类型。
涉及XY问题(由Molbdnilo怀疑):
可以使用new
的动态分配为变量"按需"(在运行时)提供存储。但是,实际上直接不建议使用new
。使用new
分配某些内容也应在不再需要内存时稍后再进行delete
。正确处理delete
(禁止使用Double delete
,但delete
co_18的某些东西会导致记忆裂缝),并不容易维护。
请注意,本地变量(如果未声明为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)
coliru
相关文章:
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 如何在不违反类型别名规则的情况下解释消息负载?
- 将一种类型的比特重新解释为不同类型的比特的技术
- 解释为什么 C++ 和 C# 对双精度类型具有不同的最大值?
- 任何人都可以解释此程序的类型促销以及为什么输出相同
- 是否有任何方法可以在初始化之前更改变量的类型,您可以用示例解释
- 写一个最小的自定义操作员:std :: Sort需要std :: __ lg为我的类型解释
- 如何用C 中的设置类型解释该方法
- 有人能解释一下特殊的std::函数模板参数列表语法(这个奇怪的类型(Types..))吗
- 以符合标准的方式用与数组相同类型的成员重新解释结构
- 解释C 中三种返回类型的方法
- 我可以合法地在布局兼容的标准布局类型之间重新解释(_C)吗
- 仅当参数可将某个类型的符号解释时,如何启用函数
- C和C 中的整数类型及其用PrintF进行解释
- 重新解释一个模板非类型参数:clang c++14 vs c++1z
- C++ 将参数类型解释为构造函数
- 双数据类型解释错误
- 算法时间复杂度类型解释