我在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;
}
我本以为在const引用上使用[]运算符会返回const引用,但是从编译器输出来看,似乎并非如此。将do_something_1的签名更改为
void do_something_1(outer_struct &thing)
解决错误。我通常在const正确性方面没有问题,但是老实说我无法弄清楚我在做什么错。任何帮助表示赞赏。
我正在使用g ++ 7.3.0。我也尝试过旧版本的GCC。
答案 0 :(得分:5)
您需要删除由decltype返回的额外引用(因为内置下标运算符的结果是引用):
using
inner_struct = ::std::remove_reference_t<decltype(::std::declval<outer_struct &>().array[0])>;