关于在构造函数中绑定临时参考成员的假警告 [英] Spurious warning about binding temporary to reference member in constructor

查看:172
本文介绍了关于在构造函数中绑定临时参考成员的假警告的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



但是,如果一个临时变量被绑定到构造函数的初始化器列表中的引用成员, ,请考虑以下代码:

  #include< functional& 
#include< iostream>

使用callback_func = std :: function< int(void)> ;;

int
func(const callback_func& callback)
{
struct wrapper
{
const callback_func& w_cb;
wrapper(const callback_func& cb):w_cb {cb} {}
int call(){return this-> w_cb()+ this-> w_cb }
};
wrapper wrp {callback};
return wrp.call();
}

int
main()
{
std :: cout< func([](){return 21;})< std :: endl;
return 0;
}

这对我来说完全有效。 callback 对象将在 func 函数的整个执行期间生效,并且不应为<$ c



确实, GCC 4.9.0 可以编译所有已启用的警告。



但是, GCC 4.8.2 编译器会给出以下警告:

  $ g ++ -std = c ++ 11 -W main.cpp 
main.cpp:在构造函数'func(const callback_func& :: func(const callback_func&):: wrapper :: w_cb'只会持续到构造函数退出[ - ] Wextra]
wrapper(const callback_func& cb):w_cb {cb} {}
^


$ b



这是我确切的编译器版本测试:

  $ g ++ --version 
g ++(GCC)4.8.2
版权C)2013自由软件基金会,
这是免费软件;请参阅复制条件的来源。有NO
保修;甚至不适用于适销性或特定用途的适用性。



  $ g ++ --version 
g ++(GCC)4.9.0 20140604(prerelease)
版权所有(C)2014 Free Software Foundation,Inc.
这是免费软件;请参阅复制条件的来源。有NO
保修;甚至不适用于适销性或特定用途的适用性。


解决方案

这是gcc 4.8中的一个错误,在4.9。以下是错误报告:



https:/ /gcc.gnu.org/bugzilla/show_bug.cgi?id=50025


I understand that if a temporary is bound to a reference member in the constructor's initializer list, the object will be destroyed as the constructor returns.

However, consider the following code:

#include <functional>
#include <iostream>

using callback_func = std::function<int(void)>;

int
func(const callback_func& callback)
{
  struct wrapper
  {
    const callback_func& w_cb;
    wrapper(const callback_func& cb) : w_cb {cb} { }
    int call() { return this->w_cb() + this->w_cb(); }
  };
  wrapper wrp {callback};
  return wrp.call();
}

int
main()
{
  std::cout << func([](){ return 21; }) << std::endl;
  return 0;
}

This looks perfectly valid to me. The callback object will live during the whole execution of the func function and no temporary copy should be made for wrapper's constructor.

Indeed, GCC 4.9.0 compiles fine with all warnings enabled.

However, GCC 4.8.2 compiler gives me the following warning:

$ g++ -std=c++11 -W main.cpp 
main.cpp: In constructor ‘func(const callback_func&)::wrapper::wrapper(const callback_func&)’:
main.cpp:12:48: warning: a temporary bound to ‘func(const callback_func&)::wrapper::w_cb’ only persists until the constructor exits [-Wextra]
     wrapper(const callback_func& cb) : w_cb {cb} { }
                                            ^

Is this a false positive or am I misunderstanding the object lifetimes?

Here are my exact compiler versions tested:

$ g++ --version
g++ (GCC) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ --version
g++ (GCC) 4.9.0 20140604 (prerelease)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

解决方案

This is a bug in gcc 4.8 that has been fixed in 4.9. Here is the bug report:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=50025

这篇关于关于在构造函数中绑定临时参考成员的假警告的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆