decltype推断失败时会发生什么?
c++吧
全部回复
仅看楼主
level 13
acebdo 楼主
我从一篇文章上看到这样一段代码,用来判断一个类型是否有foo成员函数
template<typename T>
struct has_member_foo11
{
private:
  template<typename U> static auto check(int) ->
  decltype(std::declval<U>().foo(), std::true_type());
  template<typename U> static std::false_type check(...);
public:
  enum { value = std::is_same<decltype(check<T>(0)),
     std::true_type>::value };
};
我拿着这段代码在vs2015上测试一下可以编译运行。但是这段代码有些地方不能理解:
decltype(std::declval<U>().foo(), std::true_type())这一句,当foo不存在时为什么不会出现编译错误?我把它单独拿出来用时却出现编译错误。我把第2个check函数注释掉时也出现编译错误。
decltype推断失败时到底发生了什么?推断失败时第1个check函数还在不在?
2016年02月22日 05点02分 1
level 15
百度 SFINAE
2016年02月22日 05点02分 3
明白了。当foo不存在时,第1个check函数本来就是错的,编译器选择第2个check函数,从而避开编译错误。是这个意思吧。
2016年02月22日 06点02分
传的0是个int,优先选择参数类型为int的版本,但发现无法推导,继而选择...的版本。如果所有都不匹配才报编译错误。
2016年02月22日 07点02分
明白。谢谢你的详细解释。
2016年02月22日 08点02分
1