不是你写的那样。首先,
auto foo = float(1234567891234.1234)
使用自动类型推导规则来推断RHS的类型,结果是
float
。一旦完成这个过程,
foo
的类型就是
float
并且它已经确定了(C++是
静态类型,不像Python)。下次写入时保留
float
类型。
foo = long(1234567891234.1234)
foo的类型仍然是float
,它不会神奇地变成long
。
如果你想模拟一种类型的“改变”,你最多只能执行一个强制转换:
cout << "foo (as long): " << static_cast<long>(foo) << endl;
或者使用额外的变量
long foo_long = foo
请注意浮点数表示可能导致精度损失。
如果您可以访问C++17编译器,您可以使用
std::variant<long, float>
,它是一个类型安全的联合,用于在不同类型之间切换。如果没有,您可以使用普通的联合。
#include <iostream>
union Foo
{
float f;
long l;
};
int main()
{
Foo foo;
foo.f = float(1234567891234.1234);
std::cout << "foo: " << foo.f << std::endl;
foo.l = long(1234567891234.1234);
std::cout << "foo: " << foo.l << std::endl;
}
在Coliru上实时运行
或者,您可以使用一种类型抹消技术,例如
#include <iostream>
int main()
{
void *foo;
foo = new int{42};
std::cout << *(int*)foo << '\n';
operator delete(foo);
foo = new float{42.42};
std::cout << *(float*)foo << '\n';
operator delete(foo);
}
在Coliru上实时运行
上述代码的现代版本可以使用std::shared_ptr
进行重写,如下所示:
#include <iostream>
#include <memory>
int main()
{
std::shared_ptr<void> foo{new int{42}};
std::cout << *(int*)foo.get() << '\n';
foo.reset(new float{42.42});
std::cout << *(float*)foo.get() << '\n';
}
在Coliru上实时演示
一个std::unique_ptr<void>
不起作用,因为只有std::shared_ptr
实现了类型抹除。
当然,如果你并不真的关心存储大小等问题,那就只使用两个单独的变量。
std::endl
。'\n'
可以用来结束一行。 - undefined