Тип в стиле c и оператор ()

Вопрос был изменен!

Я использую простой способ скрыть свои перечисления от локальных пространств имен — перечисление внутри структуры. Это выглядит примерно так:

struct Color
{
enum Type
{
Red, Green, Black
};
Type t_;
Color(Type t) : t_(t) {}
operator Type () const {return t_;}
private:
template<typename T>
operator T () const;
};

Оператор T () является защитой от неявного приведения типов. Затем я попытался скомпилировать этот код с помощью gcc и keil:

Color n;
int a[9];
a[ (int)n ] = 1;

gcc скомпилировал его без ошибок (что я и ожидал), но Keil дал мне ошибку:
msgstr «недопустимое преобразование типов. operator () недоступен».

Поэтому мой вопрос: какой компилятор прав?

Я знаю о классе enum c ++ 11, но он не поддерживается Keil

0

Решение

Должен ли reinterpret_cast (не c-style () cast) вызывать оператор преобразования типов?

Нет, reinterpret_cast используется только для нескольких хитрых типов конверсий:

  • преобразование указателей в целые числа и обратно
  • преобразование между указателями (и ссылками) в не связанные типы

Вам не нужно вообще приводить, чтобы использовать оператор неявного преобразования — вы вообще не предотвратили неявное преобразование. В C ++ 11, если оператор был explicitтогда вам понадобится static_cast,

Если вы застряли в C ++ 03 и действительно хотите предотвратить неявное преобразование, но разрешить явное преобразование, то я думаю, что единственное разумное, что нужно сделать, — это предоставить именованную функцию преобразования.

Обновить: Вопрос теперь изменился и задает вопрос о кастинге в стиле C, а не о reinterpret_cast, Это должно скомпилироваться, так как любое преобразование, которое может быть сделано static_cast (включая неявные преобразования) также можно выполнить с помощью приведения в стиле C.

4

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

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

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