C++ 函数和数组类型的实现是可转换的

C++ 函数和数组类型的实现是可转换的,c++,types,c++11,type-conversion,typetraits,C++,Types,C++11,Type Conversion,Typetraits,由于@Xeo,我有一个相对简单的可转换的实现: template<typename From, typename To> struct is_convertible { private: static void foo(To); template<typename F> static auto test(int) -> decltype(foo(declval<F>()), void(), true_type{}); template&l

由于@Xeo,我有一个相对简单的
可转换的
实现:

template<typename From, typename To>
struct is_convertible
{
private:
  static void foo(To);
  template<typename F>
  static auto test(int) -> decltype(foo(declval<F>()), void(), true_type{});
  template<typename>
  static auto test(...) -> false_type;
public:
  static constexpr bool value = decltype(test<From>(0))::value;
  constexpr operator bool() { return value; }
};
然后这些测试失败:

static_assert(!is_convertible<Function, Function>(), "");
static_assert(!is_convertible<Function&, Function>(), "");
static_assert(!is_convertible<Function*, Function>(), "");
static_assert(!is_convertible<Function*const, Function>(), "");
static_assert(!is_convertible<Array, const Array>(), "");
static_assert(!is_convertible<Array&, Array>(), "");
static_assert(!is_convertible<Array&, const Array>(), "");
static_assert(!is_convertible<const Array&, const Array>(), "");
static_assert(!is_convertible<char*, Array>(), "");
static_assert(!is_convertible<char*, const Array>(), "");
static_assert(!is_convertible<const char*, const Array>(), "");
static_assert(!is_convertable(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);

上述特性是否可以扩展以适用于这些类型,或者我是否需要专门化,以及它们的外观如何?

为什么
static auto test(int)->decltype(foo(declval()),void(),true_type{})
?@AndyProwl这是@Xeo防止用户定义的
操作符
把事情搞砸的伎俩。他说你不能在
void
上超载
操作员。
。哦,我明白了。我永远也不会明白这一点,谢谢你,对函数和数组类型进行部分专门化
is\u convertible
不是一种选择吗?在何种意义上它们失败了?在g++4.8和clang++3.2上,所有形式的
静态断言(::is_convertible(),“”)
(注意:不
)与A、B(来自您给出的示例)pass==均未触发。例如,
数组
不应该转换为
数组&
static_assert(!is_convertible<Function, Function>(), "");
static_assert(!is_convertible<Function&, Function>(), "");
static_assert(!is_convertible<Function*, Function>(), "");
static_assert(!is_convertible<Function*const, Function>(), "");
static_assert(!is_convertible<Array, const Array>(), "");
static_assert(!is_convertible<Array&, Array>(), "");
static_assert(!is_convertible<Array&, const Array>(), "");
static_assert(!is_convertible<const Array&, const Array>(), "");
static_assert(!is_convertible<char*, Array>(), "");
static_assert(!is_convertible<char*, const Array>(), "");
static_assert(!is_convertible<const char*, const Array>(), "");