On Tue, 03 Dec 2013 11:23:46 -0800, Krzysztof Czainski <1czajnik@gmail.com> wrote:
2013/12/3 Lorenzo Caminiti <lorcaminiti@gmail.com>
On Sat, Nov 16, 2013 at 11:18 AM, Mathias Gaunard <mathias.gaunard@ens-lyon.org> wrote:
On 16/11/2013 01:02, Mostafa wrote:
#include <boost/utility/identity_type.hpp> #include <utility>
int main() { BOOST_IDENTITY_TYPE(( std::pair<int,int> const )) x; // This compiles, so the const qualification in the // above macro parameter is ignored. x = std::make_pair(0,1);
return 0; }
The omission of const qualification in BOOST_IDENTITY_TYPE types is undocumented. This omission maybe deduced from the documented implementation, but, as noted, that is not part of the library api
and
is subject to change. I therefore propose that this behaviour be documented as part of the library's public api.
That looks like a bug.
Is there a way to extract the cv-qualifier from a function parameter type at compile-time?
some_mata_function<void (int const)>::type // evaluates to `int const` not just `int`
Right now I do the following which looses the cv-qualifier (I also tried to program my own meta-functions but I wan't able to retain the cv-qualifier).
boost::function_traits<void (int const)>::arg1_type // evaluates to `int` and not to `int conat` :(
how about (not tested): boost::remove_reference< boost::function_traits<void (int const&)>::arg1_type >::type
Pointers should be used instead. References will lead to bugs because of reference collapsing when add_reference is used. For example: BOOST_IDENTITY_TYPE(( std::pair<int,int> & )) x; will be incorrectly deduced as std::pair<int,int>