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
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函数还在不在?