繁体   English   中英

模板化转换运算符类型推导在clang和gcc中有所不同

[英]templated conversion operator type deduction differs in clang and gcc

在过去的几天里,我一直在努力解决编译器之间关于模板化转换运算符类型推导的差异,并且我最终将至少一个差异归结为堆栈溢出大小的示例:

void foo(int i);

struct any_const_reference {
  template <typename T>
  operator const T&();
};

template <typename T, typename Enable=void>
struct detect_call : std::false_type { };

template <typename T>
struct detect_call<T,
  decltype( declval<T>()( any_const_reference() ) )
> : std::true_type { };

演示

表达式detect_call<decltype(foo)>::value在clang中为true ,在gcc中为false (使用任何编译器的任何现代版本,我可以得到我的手,最新的是gcc 5.2和clang 3.8)。 问题:

  • 哪个是对的? 那是否符合C ++标准?
  • 是什么造成了这种差异?
  • 通常,在转换运算符中(或在此表单的任何转换运算符中应用于T的类型推导规则是什么,例如, template <typename T> operator T(); ),以及它们在C ++标准中给出的位置?

注意:这似乎与这个问题类似: 转换运算符的模板参数类型推导 (实际上,我也遇到了这种确切的差异),但我不太清楚这个答案和这种情况之间的映射。 如果这只是此问题的另一个实例,则此问题归结为如何将该问题映射到此用例。

这可以简化为实际调用foo()

void foo(int ) { }

struct any_const_reference {
  template <typename T>
  operator const T&();
};

int main() {
    foo(any_const_reference{}); // ok on clang
                                // error on gcc
}

这是一个gcc bug(根据上面TC的评论#63217 )。 Per [temp.deduct.conv] ,这应该将T推导为int因为应该删除引用和限定符(在这种情况下, Pconst T&Aint )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM