Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

can auto type deduction possibly cause conversion error?

Tags:

c++

c++11

g++

I have a very simple parser rule (for AXE), like this:

auto space = axe::r_lit(' ');
auto spaces = space & space & space;

The last line compiles and works as expected in VC2010, but gives a strange error in gcc 4.6:

parsers.cpp:68:34: error: conversion from 
'axe::r_and_t<
    axe::r_and_t<axe::r_char_t<char>&, axe::r_char_t<char>&>, 
    axe::r_char_t<char>&
>' to non-scalar type 
'axe::r_and_t<
    axe::r_and_t<axe::r_char_t<char>&, axe::r_char_t<char>&>&, 
    axe::r_char_t<char>&
>' requested

I wonder, whether it's a (known) bug in gcc, and whether it's even possible to get conversion errors with auto declaration. Shouldn't the deduced type for auto be always exactly the same type as the initializer?

AXE overloads operator& like this:

template<class R1, class R2>
r_and_t<
    typename std::enable_if<
       is_rule<typename std::remove_reference<R1>::type>::value, R1>::type, 
    typename std::enable_if<
       is_rule<typename std::remove_reference<R2>::type>::value, R2>::type
>
operator& (R1&& r1, R2&& r2)
{
    return r_and_t<R1, R2>(std::forward<R1>(r1), std::forward<R2>(r2));
}

I wasn't able to reduce the problem to a short test case, unfortunately every time I try to come with simple example, it compiles.

like image 222
Gene Bushuyev Avatar asked Jun 18 '11 22:06

Gene Bushuyev


2 Answers

auto is not always exactly the type of initializer, because auto is dropping references, making it type T where you would expect T&. If you need reference - spell auto&.

like image 58
Violet Giraffe Avatar answered Sep 18 '22 13:09

Violet Giraffe


Don't rate this answer, it's for information purposes only

This was indeed a bug in previous versions of gcc, it was fixed in gcc-4.7.0.

like image 38
Gene Bushuyev Avatar answered Sep 19 '22 13:09

Gene Bushuyev