首先让我先注意这里非常相似的问题:Detecting constexpr with SFINAE。不同之处在于,在这个问题中,检测方法可以检测类的静态方法。
我正在尝试检测是否可以构造constexpr副本。我非常接近,这就是我所拥有的:
template <class T>
constexpr int return_int(T t) { return 0; }
template <class T>
T& unmove(T&& t) { return t; }
template <class ... T>
using void_t = void;
template <class T, class = void>
struct is_constexpr_copy_constructible : std::false_type {};
template <class T>
struct is_constexpr_copy_constructible<T, void_t<
std::integral_constant<int,
return_int(unmove(T{}))
>
>> : std::true_type {};
此解决方案中思想的逻辑进展如下:
所以我写了函数return_int
,它给了我一个constexpr整数iff如果传递了constexpr复制构造函数的constexpr表达式。 unmove
只是确保调用复制构造函数而不是移动构造函数。
问题是,为了首先获得表达式,我必须创建我的类型。我不能使用declval
作为TMP中的标准,因为这不是一个未评估的上下文;实际上将在编译时评估return_int以计算类型。所以我坚持使用一个元函数来检测一个类型是否是constexpr copy constructible和constexpr默认可构造的。
这不是世界末日本身,因为这些东西往往会重叠,但它并不理想。有没有办法解决?从根本上说,它归结为:
请注意,在我链接的类似问题中,这根本不是问题,因为它正在检查静态方法,因此不需要实例。
帮助?