错误:将“数据”声明为引用数组

时间:2019-03-25 11:35:04

标签: c++ arrays gcc reference most-vexing-parse

C ++应用程序代码可以在GCC 4.1上正常编译。现在,我将GCC版本升级到4.4X,但出现错误。

error: declaration of ‘data’ as array of references

代码:

  inline std::string base64_encode(const std::vector< unsigned char >& data)
  {
    if (data.empty())
    {
      return "";
    }
    using namespace boost::archive::iterators;
    typedef base64_from_binary<
      transform_width< const unsigned char*, 6, 8> > base64_enc;
    std::string result(base64_enc(&data[0]),
      base64_enc(&data[0] + data.size()));
    static const std::string base64_padding[] = { "", "==", "=" };
    result.append(base64_padding[data.size() % 3]);
    return result;
  }

我读了几个答案,才知道这不符合令人烦恼的解析规则。

一种可能的解决方案是封闭     (&数据)[0]     要么     std :: string result({base64_enc(&data [0]}),           base64_enc(&data [0] + data.size();

std::string result(base64_enc(&data[0]),
      base64_enc(&data[0] + data.size()));

编译器不应将此行视为函数声明。在这种情况下,我该如何应用正确的语法?

1 个答案:

答案 0 :(得分:0)

一种选择是将std::string result(更改为std::string result = std::string((其余各行保持相同)。

我认为这是一个编译器错误,因为&data[0] + data.size()不能在声明中出现,但是我之前见过similar bugs in gcc(在解析时过早将其错误地标记为声明)。

此版本还在gcc 8.3中为我解决了该错误,并增加了一组括号:

std::string result ( (base64_enc(&data[0])), base64_enc(&data[0] + data.size()) );
//                   ^                    ^