为什么 c++ 不允许(自动)强制转换?

Why doesn't c++ allow (auto) casting?

本文关键字:转换 自动 c++ 不允许 为什么      更新时间:2023-10-16

例如,当从 void* 转换为 PMY_OBJECT 时,必须执行以下操作:

void MyFunction(void* v) {
PMY_OBJECT p = (PMY_OBJECT) v;
}

在 C 中,您根本不需要强制转换它,但在 C++ 中,最接近的东西是:

PMY_OBJECT p = (decltype(p)) v;

为什么不简单地:

PMY_OBJECT p = (auto) v;

请注意,这都是假设,因为C++是由一个必须考虑许多特殊情况和吹毛求疵的委员会设计的。

话虽如此,C++明确不鼓励使用(type)val语法;static_castdynamic_cast和其他显式强制转换是首选,因为这样可以更容易地发现由不正确的强制转换引起的错误。

事实上,正如其他答案/评论所提到的,在您的问题(初始化变量(的特定情况下,您可以将auto用于该变量类型并强制使用初始值设定项的类型,例如static_cast,像这样:

auto p = static_cast<PMY_OBJECT>(v);

这实际上很常见;我已经看到它被使用并且至少使用过几次。但是,请注意在没有必要的情况下不要过度使用它,因为您最终可能会否定auto首先带来的许多好处。

通过允许(auto)(这实际上是强制强制(,你正在引入与C型转换相关的所有问题,几乎没有获得便利。

你可以自己写auto_cast

#include <utility>
template <typename From>
class auto_cast {
public:
explicit constexpr auto_cast(From const& t) noexcept
: val { t }
{
}
template <typename To>
constexpr operator To() const noexcept(noexcept(static_cast<To>(std::declval<From>())))
{
return static_cast<To>(val);
}
private:
From const& val;
};
void foo(void* p)
{
int* ip = auto_cast(p);
char* cp = auto_cast(p);
double* dp = auto_cast(p);
}