为什么C++不允许(自动)铸造?

为什么C++不允许(自动)铸造?,c++,casting,C++,Casting,例如,从void*转换为PMY_对象时,必须执行以下操作: void MyFunction(void* v) { PMY_OBJECT p = (PMY_OBJECT) v; } 在C中,你根本不必把它扔出去,但是C++中最接近的事情是: PMY_OBJECT p = (decltype(p)) v; 为什么不简单地: PMY_OBJECT p = (auto) v; ?您可以自己编写自动转换: #include <utility> template <ty

例如,从void*转换为PMY_对象时,必须执行以下操作:

void MyFunction(void* v) {

    PMY_OBJECT p = (PMY_OBJECT) v;

}
在C中,你根本不必把它扔出去,但是C++中最接近的事情是:

PMY_OBJECT p = (decltype(p)) v;
为什么不简单地:

PMY_OBJECT p = (auto) v;

您可以自己编写自动转换:

#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);
}
你可以自己写下“自动转换”:

#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);
}

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

,C++明确地阻止使用类型语法;静态强制转换、动态强制转换和其他显式强制转换是首选,因为这样更容易发现由不正确强制转换引起的错误

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

auto p = static_cast<PMY_OBJECT>(v);
这其实很普遍,;我见过它被使用过,而且至少使用过好几次。然而,注意不要在没有必要的情况下过度使用它,因为你可能会首先否定汽车带来的许多好处


通过允许自动强制强制的AUTO,您将引入与C样式转换相关的所有问题,但很少获得便利。

< P>这是假设中的,请注意,因为C++是由一个委托人设计的,它必须考虑很多特殊情况和NITPICK。

,C++明确地阻止使用类型语法;静态强制转换、动态强制转换和其他显式强制转换是首选,因为这样更容易发现由不正确强制转换引起的错误

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

auto p = static_cast<PMY_OBJECT>(v);
这其实很普遍,;我见过它被使用过,而且至少使用过好几次。然而,注意不要在没有必要的情况下过度使用它,因为你可能会首先否定汽车带来的许多好处


通过允许“自动”(auto)这一有效的强制强制方式,您引入了与C样式转换相关的所有问题,但所获得的便利性很小。

auto p=PMY_OBJECT v;?当我们在C中写时,我们认为在C.,当我们用C++编写时,我们用C++来思考:不要混用。你能解释为什么代码中有void*?你可以编写一个函数auto_cast,使PMY_OBJECT=auto_castv做你想做的事情。@MarekR很可能函数接口必须符合某些C回调fptr API.auto p=PMY_OBJECT v;?当我们在C中写时,我们认为在C.,当我们用C++编写时,我们用C++来思考:不要混用。你能解释一下为什么代码中有void*?吗?你可以编写一个函数auto_cast,这样PMY_OBJECT=auto_castv就可以做你想做的事情。@MarekR很可能函数接口必须符合某些C回调fptr API。@super我的auto_cast函数怎么不能完全做你想做的事情?如果有任何反馈,我将不胜感激。解决方案是:auto p=static\u castv;-显然不是在我提议的方面。此外,auto_cast真的能保证编译时强制转换吗?@super谢谢你的反馈。我删除了不相关的部分,现在函数是constexpr。在这种特殊情况下,编译器擅长省略函数调用。如果您不确定的话,可以在几个案例中查看asm。@super我的auto_cast函数如何不能完全满足您的要求?如果有任何反馈,我将不胜感激。解决方案是:auto p=static\u castv;-显然不是在我提议的方面。此外,auto_cast真的能保证编译时强制转换吗?@super谢谢你的反馈。我删除了不相关的部分,现在函数是constexpr。在这种特殊情况下,编译器擅长省略函数调用。如果您不确定,请在几种情况下查看asm。