C++17 中 CTAD(类模板参数推导)鲜为人知的特性:您可以将用户定义的推导指南标记为explicit
. (神箭。)
template<class T> struct A { A(int); }; A(int) -> A<int>;
template<class T> struct B { B(int); }; explicit B(int) -> B<int>;
A<int> a = 1; // OK, constructor of A<int> is implicit
B<int> b = 1; // OK, constructor of B<int> is implicit
auto a = A(1); // OK, deduction guide of A exists
auto b = B(1); // OK, deduction guide of B exists
A a = 1; // OK, deduction guide of A is non-explicit
B b = 1; // ERROR!! deduction guide of B is explicit
A
因此,类模板B
具有明显不同的行为。我想编写一个单元测试,static_assert
我的一个模板的行为类似于B
,而不是A
。
static_assert(!has_properly_explicit_deduction_guide_v<A>);
static_assert(has_properly_explicit_deduction_guide_v<B>);
这在 C++17 和/或 C++20 和/或“C++future”中是否可行?