gpt4 book ai didi

c++ - 模板化转换运算符类型推导在 clang 和 gcc 中不同

转载 作者:太空狗 更新时间:2023-10-29 20:55:04 32 4
gpt4 key购买 nike

在过去的几天里,我一直在与编译器之间在模板化转换运算符类型推导方面的差异作斗争,我终于将至少一个差异归结为一个堆栈溢出大小的示例:

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 { };

Demo

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

  • 哪个是正确的?即哪个符合C++标准?
  • 造成这种差异的原因是什么?
  • 一般来说,适用于 T 的类型推导规则是什么?在转换运算符(或任何这种形式的转换运算符,例如 template <typename T> operator T(); )中,它们在 C++ 标准中的何处给出?

注意:这似乎与这个问题类似:Template argument type deduction by conversion operator (事实上​​ ,我也遇到了那个确切的区别),但我不太明白那个答案和这个案例之间的映射。如果这只是此问题的另一个实例,那么这个问题归结为如何将该问题映射到此用例中。

最佳答案

这可以简化为实际调用 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 错误(#63217 根据上面 TC 的评论)。每[temp.deduct.conv] , 这应该将 T 推断为 int 因为引用和限定符都应该被删除(在这种情况下 Pconst T&Aint)。

关于c++ - 模板化转换运算符类型推导在 clang 和 gcc 中不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36988281/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com