Я использую массивы в стиле 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.