Подтвердить что ты не робот

В С++ может ли C-стиль использовать функцию преобразования, а затем отбрасывать константу?

GCC и Clang отклоняют C-стиль в следующем коде.

http://coliru.stacked-crooked.com/a/c6fb8797d9d96a27

struct S {
    typedef const int* P;
    operator P() { return nullptr; }
};
int main() {
    int* p1 = const_cast<int*>(static_cast<const int*>(S{}));
    int* p2 = (int*)(S{});
}
main.cpp: In function 'int main()':
main.cpp:7:25: error: invalid cast from type 'S' to type 'int*'
     int* p2 = (int*)(S{});
main.cpp:7:15: error: cannot cast from type 'S' to pointer type 'int *'
    int* p2 = (int*)(S{});
              ^~~~~~~~~~~

Однако, согласно стандарту, листинг C-стиля может выполнять преобразования, выполненные с помощью static_cast, за которым следует const_cast. Является ли этот код хорошо сформированным? Если нет, почему бы и нет?

4b9b3361

Ответ 1

Это основная проблема 909:

Согласно пункту 5.4 [expr.cast] 4, одна возможная интерпретация старинного стиля - это static_cast, за которым следует const_cast. Один поэтому следует ожидать, что выражения, помеченные # 1 и # 2 в следующий пример будет иметь одинаковую ценность и значение:

struct S {
  operator const int* ();
};

void f(S& s)  {
  const_cast<int*>(static_cast<const int*>(s));  // #1
  (int*) s;  // #2
}

Однако ряд реализаций выдает ошибку на # 2.

Является ли намерение, что (T*)x следует интерпретировать как нечто вроде

const_cast<T*>(static_cast<const volatile T*>(x))

Обоснование (июль 2009 г.):

Согласно простой интерпретации формулировки, пример должен работать. Это, по-видимому, просто ошибка компилятора.

Это, по-видимому, никогда не разрешалось ни Кланом, ни GCC. Время открытия билетов.