首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动类型推导会不会导致转换错误?

自动类型推导会不会导致转换错误?
EN

Stack Overflow用户
提问于 2011-06-19 06:46:23
回答 4查看 610关注 0票数 9

我有一个非常简单的解析器规则(针对AXE),如下所示:

代码语言:javascript
复制
auto space = axe::r_lit(' ');
auto spaces = space & space & space;

在VC2010中,最后一行代码按照预期进行编译和工作,但在gcc 4.6中出现了一个奇怪的错误:

代码语言:javascript
复制
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

我想知道,这是否是一个(已知的)在gcc的错误,以及是否可能得到转换错误的auto声明。auto的推导类型不应该总是与初始化器的类型完全相同吗?

AXE overloads operator&如下所示:

代码语言:javascript
复制
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));
}

我无法将问题简化为一个简短的测试用例,不幸的是,每次我尝试使用简单的示例时,它都会编译。

EN

回答 4

Stack Overflow用户

发布于 2011-11-27 14:35:09

auto并不完全是初始化器的类型,因为auto删除了引用,使其在您期望T的地方成为T&类型。如果你需要引用拼写auto&

票数 3
EN

Stack Overflow用户

发布于 2012-05-19 05:03:23

不要给这个答案打分,这只是为了提供信息,

这在以前的版本中确实是个bug,在gcc-4.7.0中已经修复了。

票数 2
EN

Stack Overflow用户

发布于 2011-10-02 19:29:39

问题出在参考文献中。

代码语言:javascript
复制
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

第一个模板参数是第一个模板参数的axe::r_and_t<axe::r_char_t<char>&, axe::r_char_t<char>&>,第二个模板参数是axe::r_and_t<axe::r_char_t<char>&, axe::r_char_t<char>&>&。这是一个模板参数不匹配-可能是在返回值中。最有可能发生这种情况的原因是,Visual Studio的SFINAE实现充其量是不可靠的,并且它没有正确地实现两阶段查找,并且可能是GCC版本选择了不同于Visual Studio的重载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6399363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档