Обеспечение безопасности auto_cast

GMan опубликовал код для Delicious auto_cast «оператора» , который позволяет писать такой код на C ++ :

float f = 4.0f;
int i = auto_cast(f);
// instead of:
int j = static_cast(f);

или, что более важно,

T x = value;
typename nested_type::type y = auto_cast(x);
// instead of
typedef typename nested_type::type my_type;
my_type z = static_cast(x);

В принципе, этот оператор отлично справляется с удалением ненужной избыточности из static_cast , и в то же время остается безопасным . Это даже безопаснее, чем static_cast , поскольку предотвращает случайное несовпадение типов:

int i = 1234;
short s = static_cast(i); // s == -46, not 1234!

Однако j_random_hacker обнаружил недостаток в операторе:

static_cast разрешает понижающие, которые потенциально небезопасны.

Действительно, auto_cast , вероятно, должен запрещать понижающие передачи, потому что они могут не работать:

class base { };
class derived : public base { };

base b;
derived* pd = auto_cast(&b); // should fail at compile time.

Отсюда мой вопрос: Вероятно, это будет связано с enable_if . Меня особенно интересует решение, которое позволяет компилятору предоставлять хорошую диагностику в случае сбоя (= читаемые сообщения об ошибках).

13
задан Community 23 May 2017 в 12:13
поделиться