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
. Является ли этот код хорошо сформированным? Если нет, почему бы и нет?