检查表达式是否编译包括所有隐式转换

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在测试表达式的正确性时如何使失败.

Col*_*mbo 5

您必须定义相应的特征并在断言中使用它.例如

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)