cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Make '=delete' greate again! #377

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +3, -2 Автор идеи: Сергей Аксенов

Сейчас (Си++11) компилятор сначала выбирает перегрузку, а уже после смотрит какие методы удалены. В итоге иногда не может выбрать из 2 методов - удаленного и и нет.

Например, такой код работать не будет

    class Class
    {
    public:
        Class(uint64_t value);

        operator uint64_t&();
        operator const uint64_t&() const;

        operator uint32_t&() = delete;
        operator const uint32_t&() const = delete;

    private:
        uint64_t m_value;
    };
double val = Class(0); // ambiguous call (GCC)

Вообще, конечно, эта идея вообще не сработает =( Просто это реальная попытка уменьшить боль от неявного приведения uint64_t к uint32_t. Особенно актуально для size_t, который отличается на x86 и x64.

Подробнее здесь: https://stackoverflow.com/questions/38565358/call-ambigious-due-to-a-deleted-function https://stackoverflow.com/questions/13703186/ambiguous-overload-with-deleted-move-constructor

apolukhin commented 3 years ago

Andrey Davydov, 29 ноября 2018, 18:28 Пишите вместо = delete requires(false).