Как вызвать ошибку вызывающего при вызове конструктора или приведения типов?

Я пытаюсь сделать шаблон «strong typedef», который запрещает приведение между различными типами. В соответствующей части текущий (рабочий) код выглядит так:

template<typename T, typename Tag>
struct strong_typedef_impl {
public:
//! ---- error struct (for better MSVC diagnostic)
struct error { friend struct strong_typedef_impl; private: error(){} ~error(){} };

//! ----  Construction
/*implicit*/ strong_typedef_impl(const strong_typedef_impl& other) : value(other.value) {}
/*implicit*/ template<typename U, typename UTag>
strong_typedef_impl(const strong_typedef_impl<U, UTag>&) : value() {
static_assert(false, "One must not cast one strong typedef to another");
}

//! ----  Type casting
/*explicit*/ inline operator T(void) const {return value;}
template<typename U, typename UTag>
/*implicit*/ operator strong_typedef_impl<U,UTag>(void) const {
static_assert(false, "One must not cast one strong typedef to another");
}

//! ----  Assignment
const strong_typedef_impl& operator=(const strong_typedef_impl& other) {
value = other.value; return *this;
}
const strong_typedef_impl& operator=(strong_typedef_impl&& other) {
value = other.value; return *this;
}
//template all-encompassing assignment to avoid implicit casting
template <typename U> error operator=(const U&) {
//static_assert(false, "One must not assign anything else to a strong typedef");
return error();
}
//...
};

Третий оператор присваивания возвращает error вместо провала static_assert потому что проект обычно компилируется компилятором MSVC из Qt Creator и когда он видит static_assert терпеть неудачу, это отмечает только строку с assert сам по себе, а не код вызывающей стороны (в лучшем случае это заставляет того, кто получил проблему, читать журналы компиляции; в худшем случае тот, кто получил проблему, просто предполагает, что это была моя ошибка). Но вернулся error Вместо этого объект вынуждает компилятор уничтожить его в коде вызывающего, тем самым помечая правильную строку ценой менее информативного сообщения.
Однако я не могу придумать подобную хитрость для кастинга. Изначально я думал, что пишу конструктор

/*implicit*/ template<typename U, typename UTag>
strong_typedef_impl(const strong_typedef_impl<U, UTag>&, error e = error()) : value() { }

заставит звонящего звонить error(), что приводит к ошибке, но это не так.

Кто-нибудь знает какой-нибудь способ «обмануть» компилятор, чтобы он делал неправильный код на стороне вызывающего в этом случае? Или может быть какой-то другой способ получить значимую диагностику от компилятора MSVC?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]