Spurious warning about binding temporary to reference member in constructor

筅森魡賤 提交于 2019-11-27 14:37:10

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

As pointed out by Howard Hinnant and already indicated by R Sahu's comment, this is a bug (which used to be required by the then-broken standard; thanks to Tony D for pointing this out) in the way GCC 4.8 is treating initializer lists.

Changing the constructor in my original example from

wrapper(const callback_func& cb) : w_cb {cb} { }

to

wrapper(const callback_func& cb) : w_cb (cb) { }

makes the warning with GCC 4.8.3 go away and the created executable Valgrind clean. The diff of the two assembly files is huge so I don't post it here. GCC 4.9.0 creates identical assembly code for both versions.

Next, I replaced the std::function with a user-defined struct and deleted copy and move constructors and assignment operators. Indeed, with GCC 4.8.3, this retains the warning but now also gives a (slightly more helpful) error that the above line of code calls the deleted copy constructor of the struct. As expected, there is no difference with GCC 4.9.0.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!