有什么办法可以在初始化之前更改变量的类型,您可以举例说明吗?

时间:2019-03-18 05:58:08

标签: c++

int element;                
(float)element;
cout << typeid(element).name() << endl;

1 个答案:

答案 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进行某些操作会导致内存泄漏),维护起来并不容易。

请注意,局部变量(如果未声明为staticextern)的生命周期从输入范围开始直到生命周期结束。因此,值得怀疑的是,替代类型的共享存储是否值得。相反,只能使用相应数量的替代局部变量。

但是,可以使用unionstd::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)

Live Demo on coliru