C ++ приведение нотации явного преобразования типов (приведение в стиле C) и множественные интерпретации static_cast - PullRequest
0 голосов
/ 29 сентября 2018

Параграф 4 [expr.cast] (в последнем проекте стандарта C ++, доступном на момент написания), который описывает поведение приведения в стиле C, говорит следующее:

Преобразования, выполняемые

  • a const_­cast,
  • a static_­cast,
  • a static_­cast, за которыми следует const_­cast,
  • a reinterpret_­cast или
  • a reinterpret_­cast с последующими const_­cast,

могут быть выполнены с использованием приведенной нотации явного типапреобразование.Применяются те же семантические ограничения и поведения, за исключением того, что при выполнении static_­cast в следующих ситуациях преобразование допустимо, даже если базовый класс недоступен:

  • указатель на объект производногоТип класса или lvalue или rvalue производного типа класса могут быть явно преобразованы в указатель или ссылку на однозначный тип базового класса, соответственно;
  • указатель на член производного типа класса может быть явно преобразован в указательчлену однозначного невиртуального типа базового класса;
  • указатель на объект однозначного невиртуального типа базового класса, glvalue однозначного невиртуального типа базового класса или указатель на членоднозначного не виртуального типа базового класса может быть явно преобразован в указатель, ссылку или указатель на член производного типа класса, соответственно.

Если преобразование можно интерпретировать болеечем один из способов, перечисленных выше, интерпретация, котораяпоявляется первым в списке, используется, даже если приведение в результате этой интерпретации является плохо сформированным. Если преобразование можно интерпретировать более чем одним способом как static_­cast, за которым следует const_­cast, преобразование является некорректным .[...]

Мой вопрос заключается в том, как " преобразование можно интерпретировать более чем одним способом как static_cast, за которым следует const_cast"?

Спасибо.

1 Ответ

0 голосов
/ 30 сентября 2018

Примерно так:

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

S s;
(int**)s;  // error: cannot cast from type 'S' to pointer type 'int **'

Подобные приведения к int const** и int *const* успешны. Демо

...