警告:不应该使用临时初始化非const引用

时间:2011-04-19 12:05:44

标签: c++ sunstudio

我从Sun Studio 12.1的标题中收到警告,其中包含以下代码段:

#include <vector>

std::vector<int> g()
{
  std::vector<int> result;
  result.push_back(5);
  return result;
}

int main()
{
  int b = g()[0];  // <- Warning in this line

  return b;
}

警告文字是:

Warning: should not initialize a non-const reference with a temporary.

虽然我知道用临时函数初始化非const引用是一件坏事,但我看不出这是怎么发生的。我知道[0]返回对向量的第一个元素的引用,它本身是临时的,但我看不出问题是什么。

有人可以解释

  • 为什么编译器会抱怨?
  • 这是合法警告吗?
    • 如果是,我需要更改什么?
    • 如果不是,我怎么能优雅地沉默呢?

3 个答案:

答案 0 :(得分:4)

不,这不合法。 g()的返回值是临时的,但不是const - 您无法获得非const引用它。非const成员operator[]在此处调用是完全有效的,并且双向整数转换同样安全。

答案 1 :(得分:2)

这个Sun编译器看起来很奇怪,它对我来说似乎不合法。 Ideone编译它没有问题。

关于沉默部分:

std::vector<double> const tmp = g();
int b = tmp[0];

即,引入命名变量而不是暂时浮动。

修改

正如评论中所建议的那样,对返回值进行常量限定可能有所帮助。

std::vector<double> const g();

int main() {
  int b = g()[0];
  return b;
}

答案 2 :(得分:1)

是的,它确实使用临时初始化非const引用。但仅在概念上在重载解决期间而不是实际上。编译器不应该警告它。

在重载决策中,operator[]具有此功能参数签名

operator[](std::vector<int>&, std::vector<int>::size_type);

第一个参数将接收g()返回的临时值,但如上所述,这很好,C ++特别为该引用提供了一个异常,即所谓的“隐式对象参数”,以便重载解析接受临时参数。