> On Dec. 17, 2014, 11:36 p.m., Dominic Hamon wrote:
> > any idea what is missing from g++ 4.6 that causes this failure?
>
> Michael Park wrote:
> It's a bug in the `<tr1/functional>` header. The `operator()`'s
> implementation doesn't perfect-forward the args correctly.
>
> ```cpp
> #include <tr1/functional>
>
> void F(int&& x) {}
>
> void G(const std::tr1::function<void(int&&)>& x) {
> x(42);
> }
>
> int main() {
> G(F);
> }
> ```
>
> ```
> In file included from a.cc:1:0:
> /usr/include/c++/4.6/tr1/functional: In member function ‘_Res
> std::tr1::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const
> [with _Res = void, _ArgTypes = {int&&}]’:
> a.cc:7:7: instantiated from here
> /usr/include/c++/4.6/tr1/functional:2040:46: error: invalid
> initialization of reference of type ‘int&&’ from expression of type ‘int’
> /usr/include/c++/4.6/tr1/functional:2040:46: error: return-statement with
> a value, in function returning 'void' [-fpermissive]
> /usr/include/c++/4.6/tr1/functional: In static member function ‘static
> void std::tr1::_Function_handler<void(_ArgTypes ...),
> _Functor>::_M_invoke(const std::tr1::_Any_data&, _ArgTypes ...) [with
> _Functor = void (*)(int&&), _ArgTypes = {int&&}]’:
> /usr/include/c++/4.6/tr1/functional:2021:6: instantiated from
> ‘std::tr1::function<_Res(_ArgTypes ...)>::function(_Functor, typename
> __gnu_cxx::__enable_if<(! std::tr1::is_integral<_Functor>::value),
> std::tr1::function<_Res(_ArgTypes ...)>::_Useless>::__type) [with _Functor =
> void (*)(int&&), _Res = void, _ArgTypes = {int&&}, typename
> __gnu_cxx::__enable_if<(! std::tr1::is_integral<_Functor>::value),
> std::tr1::function<_Res(_ArgTypes ...)>::_Useless>::__type =
> std::tr1::function<void(int&&)>::_Useless]’
> a.cc:11:6: instantiated from here
> /usr/include/c++/4.6/tr1/functional:1684:9: error: invalid initialization
> of reference of type ‘int&&’ from expression of type ‘int’
> ```
>
> The `<functional>` header correctly perfect-forwards the arguments so we
> can make the above program by simply switching from `std::tr1::function` to
> `std::function`.
>
> ```cpp
> #include <functional>
>
> void F(int&& x) {}
>
> void G(const std::function<void(int&&)>& x) {
> x(42);
> }
>
> int main() {
> G(F);
> }
> ```
make the above program *work* by
- Michael
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/29180/#review65386
-----------------------------------------------------------
On Dec. 17, 2014, 11:33 p.m., Michael Park wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviews.apache.org/r/29180/
> -----------------------------------------------------------
>
> (Updated Dec. 17, 2014, 11:33 p.m.)
>
>
> Review request for mesos, Benjamin Hindman and Dominic Hamon.
>
>
> Bugs: MESOS-2192
> https://issues.apache.org/jira/browse/MESOS-2192
>
>
> Repository: mesos-git
>
>
> Description
> -------
>
> Fixed a compilation issue in GCC 4.6.
>
>
> Diffs
> -----
>
> 3rdparty/libprocess/include/process/clock.hpp
> 1fd418b31133fd5a5444095ac887c77ee9375b2d
> 3rdparty/libprocess/src/clock.cpp dfe9ced2415b8567abb8c137ab73d90b59164d67
> 3rdparty/libprocess/src/process.cpp
> 028b33e7ecb7e0a39334ac4ab0279ee327a72a56
>
> Diff: https://reviews.apache.org/r/29180/diff/
>
>
> Testing
> -------
>
> make check
>
>
> Thanks,
>
> Michael Park
>
>