Типобезопасный using/typedef

Клеванец  Игорь
Клеванец Игорь

Такой код сейчас компилируется.

// C++17
using Uid = uint64_t;
using IpV4 = uint32_t;

void foo(IpV4) {}

int main() {
    foo((int)0);
    foo((Uid)0);

    return 0;
}

Чтобы обезопасить тип IpV4, нужно сделать класс, у которого надо определить все потребные операторы. Хочется иметь возможность сделать это проще: указать тип, от которого наследуюется поведение, но при этом не происходит неявного приведения типов - как в Golang. Сейчас using/typedef не создают новый тип, они дают ему новое имя.

Примеры использования фичи (например, через ключевое слово explicit):

using explicit Comment = std::string;
using explicit Login = std::string;
using explicit Password = std::string;

using explicit Age = uint8_t;

void foo(Comment comment) {}
...
foo(Comment("like!"));
//foo(Login(argv[1])); // fails to compile
30
рейтинг
2 комментария
Andrey

https://stdcpp.ru/proposals/854534c4-1ab4-42ba-9436-1bb3017f0de5

Andrey
Обновлено 
Игорь Гусаров

Кажется, это предложение упирает именно на отсутствие неявного приведения нового типа к базовому типу. В то время как дискуссия 2017 года предполагала сохранение такого приведения.

Но если приведения нет, то как будут вычисляться выражения вида

Login    l{"nobody"};
Comment  c{"This is account of user "};

c += l;
Игорь Гусаров
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения