处理constexpr函数中的致命错误(或断言)

时间:2019-02-25 12:47:08

标签: c++ c++17

如果参数类型T错误,应该在以下函数中做什么?

    template <class T>
    constexpr inline size_t GetObjectSize(const T & val)
    {
        if constexpr (std::is_arithmetic<T>::value)
        {
            return sizeof(val);
        }

        if constexpr (std::is_class<T>)
        {
            return 5u;
        }

        //there should be compile time error.
    }

    int * p;
    //compile time error
    GetObjectSize(p);

可能的选择是1)引发异常2)assert 3)static_assert

1)我应该抛出哪种类型的异常?

2)它是实现定义的,不能保证是costexpr。

3)static_assert(false)总是独立于T而失败。

1 个答案:

答案 0 :(得分:1)

  

static_assert(false)始终独立于T而失败。

然后使其依赖于T

template<typename>
struct always_false { enum {value = 0}; };

// ...

if constexpr(...) {
}
else {
    static_assert(always_false<T>::value, "Some useful description");
}

是的,这是魔术师的把戏。但是法律草率的说法还是可以的。遗憾的是,实际上并没有更好的方法在if constexpr的从属分支中打印有用的诊断。