«обязательная ссылка типа отбрасывает квалификаторы» при использовании оператора [] - PullRequest
0 голосов
/ 30 октября 2018

Я использую массивы в стиле C в приложении c ++ (требуется интерфейс с кодом C), однако я получаю «ссылку на привязку квалификаторов отбрасывания типов» при использовании оператора [] в массиве. Вот небольшой пример:

#include <iostream>
struct outer_struct {
  struct {
    int i;
  } array[1];
} temp_struct;

typedef decltype( static_cast<outer_struct*>(nullptr)->array[0]  ) typed;

void do_something_2(const typed &thing)
{
  std::cout << thing.i << std::endl;
}

void do_something_1(const outer_struct &thing)
{
  // error: binding reference of type ‘outer_struct::<unnamed struct>&’ to
  // ‘const outer_struct::<unnamed struct>’ discards qualifiers
  do_something_2(thing.array[0]);
}

int main()
{
  temp_struct.array[0].i = 2;
  do_something_1(temp_struct);
  return 0;
}

Я бы подумал, что использование оператора [] для ссылки на константу вернул бы ссылку на константу, но из выходных данных компилятора оказалось, что это не так. Изменение подписи do_something_1 на

void do_something_1(outer_struct &thing)

устраняет ошибку. У меня обычно нет проблем с правильностью, но я, честно говоря, не могу понять, что я делаю здесь неправильно. Любая помощь приветствуется.

Я использую g ++ 7.3.0. Я также пробовал более старые версии GCC.

1 Ответ

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

Вам нужно отбросить дополнительную ссылку, возвращаемую decltype (потому что результатом встроенного оператора индекса является ссылка):

using
inner_struct = ::std::remove_reference_t<decltype(::std::declval<outer_struct &>().array[0])>;

онлайн-компилятор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...