微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

警告:不应使用临时初始化非常量引用

如何解决警告:不应使用临时初始化非常量引用

| 我从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.
虽然我知道用临时变量初始化非常量引用是一件坏事,但我看不到这是怎么发生的。我知道
[0]
返回对向量的第一个元素的引用,该元素本身是临时的,但是我看不出问题出在哪里。 有人可以解释吗 为什么编译器会抱怨? 这是合法的警告吗? 如果是,我必须更改什么? 如果没有,我该如何优雅地使其静音?

解决方法

这个Sun编译器看起来很奇怪,对我而言似乎根本不合法。 Ideone编译它没有问题。 关于沉默部分:
std::vector<double> const tmp = g();
int b = tmp[0];
也就是说,引入命名变量而不是使临时变量保持浮动。 编辑: 如注释中所建议,对返回值进行const限定可能会有所帮助。
std::vector<double> const g();

int main() {
  int b = g()[0];
  return b;
}
,不,这是不合法的。
g()
的返回值是一个临时值,但不是const-您无法获得对其的非const引用。非常量成员
operator[]
非常适合在此处调用,并且从double到integer的转换同样安全。,是的,它确实使用临时初始化非常量引用。但是仅在概念上是在重载解决期间,而不是实际。编译器不应对此发出警告。 在过载解析中,“ 6”具有此功能参数签名
operator[](std::vector<int>&,std::vector<int>::size_type);
第一个参数将接收由
g()
返回的临时变量,但是可以这样说,这很好,并且C ++特别为该引用提供了一个例外,即所谓的“隐式对象参数”,以便重载解析接受该参数。临时论点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。