Vin*_*ent -1 c++ static-assert compile-time implicit-conversion c++11
请考虑以下代码:
void f(auto& i, auto& j)
{
static_assert(/* SOMETHING */, "");
// function body here...
}
Run Code Online (Sandbox Code Playgroud)
我希望该/* SOMETHING */部件检查以下代码是否编译(考虑所有标准规则,如隐式转换规则):
i += j;
Run Code Online (Sandbox Code Playgroud)
我试过了:
sizeof(std::declval<decltype(i)>() += std::declval<decltype(j)>());
Run Code Online (Sandbox Code Playgroud)
但它失败了.
这样做的正确方法是什么?
编辑:我了解SFINAE和约束模板参数.这不是问题的主题.主题是static_assert在测试表达式的正确性时如何使失败.
您必须定义相应的特征并在断言中使用它.例如
template <typename A, typename B, typename=void> struct check : std::false_type{};
template <typename A, typename B>
struct check<A, B, std::void_t<decltype(std::declval<A&>() += std::declval<B&>())>>
: std::true_type{};
Run Code Online (Sandbox Code Playgroud)
或者,如果概念可用,
template <typename A, typename B>
concept bool check = requires (A& a, B& b) {a += b;};
Run Code Online (Sandbox Code Playgroud)