Почему c ++ не позволяет (авто) приведение? - PullRequest
1 голос
/ 10 февраля 2020

При преобразовании, например, из void * в PMY_OBJECT, нужно сделать что-то вроде этого:

void MyFunction(void* v) {

    PMY_OBJECT p = (PMY_OBJECT) v;

}

В C вам не нужно вообще разыгрывать его, но в с ++ самая близкая вещь была бы:

PMY_OBJECT p = (decltype(p)) v;

Почему бы просто:

PMY_OBJECT p = (auto) v;

?

Ответы [ 2 ]

6 голосов
/ 10 февраля 2020

Это все говорит гипотетически, заметьте, потому что C ++ разработан комитетом, который должен рассмотреть множество особых случаев и мелочей.

При этом, C ++ явно не рекомендует использовать (type)val синтаксис; static_cast, dynamic_cast и другие явные приведения предпочтительны, поскольку это значительно облегчает обнаружение ошибок, возникающих в результате неправильных приведений.

Фактически, как упоминается в другом ответе / комментарии, в указанном c в вашем вопросе (инициализация переменной), вы можете использовать auto для этого типа переменной и принудительно установить тип инициализатора, например, static_cast, например так:

auto p = static_cast<PMY_OBJECT>(v);

Это на самом деле довольно часто; Я видел, как он использовал и использовал его, по крайней мере, пару раз. Однако обратите внимание, чтобы не использовать над в тех случаях, когда в этом нет необходимости, поскольку в конечном итоге вы можете отменить множество преимуществ, которые auto приносит в первую очередь.

Позволяя (auto) (что по сути является принудительным принуждением), вы представляете все проблемы, связанные с приведением в стиле C, для очень небольшого удобства.

4 голосов
/ 10 февраля 2020

Вы можете написать 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);
}
...