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

C++ 处理constexpr函数中的致命错误(或断言),c++,c++17,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 constexp

如果参数类型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);
模板
constexpr内联大小\u t GetObjectSize(const t&val)
{
if constexpr(std::is_算术::value)
{
返回sizeof(val);
}
如果constexpr(std::is_类)
{
返回5u;
}
//应该有编译时错误。
}
int*p;
//编译时错误
GetObjectSize(p);
可能的替代方案是1)引发异常2)3)静态断言

1) 我应该抛出什么类型的异常

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

3) 静态断言(false)总是独立于T失败

静态断言(false)总是独立于T失败

然后使其依赖于
T

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

// ...

if constexpr(...) {
}
else {
    static_assert(always_false<T>::value, "Some useful description");
}
模板
结构总是_false{enum{value=0};};
// ...
如果constexpr(…){
}
否则{
static_assert(总是_false::value,“一些有用的描述”);
}
是的,这是魔术师的把戏。但是法律的枯燥文字是可以接受的。遗憾的是,在
if constexpr
的依赖分支中打印有用的诊断信息,没有更好的方法

静态断言(false)总是独立于T失败

然后使其依赖于
T

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

// ...

if constexpr(...) {
}
else {
    static_assert(always_false<T>::value, "Some useful description");
}
模板
结构总是_false{enum{value=0};};
// ...
如果constexpr(…){
}
否则{
static_assert(总是_false::value,“一些有用的描述”);
}

是的,这是魔术师的把戏。但是法律的枯燥文字是可以接受的。遗憾的是,如果constexpr

的依赖分支中打印有用的诊断,没有更好的方法了。在这种情况下,专业化可能更好?和往常一样,在类型上执行
开关
if
检查通常是一种反模式。@Someprogrammerdude是的,专门化看起来更好,因为我需要专门化静态断言,请参见答案。@Someprogrammerdude这不太正确。static_assert(false)可以与“if-else if-else”一起使用。@Someprogrammerdude static_assert(false)可以与MSVC2017一起使用,但与GCC不一起使用。在这种情况下,专业化可能更好?和往常一样,在类型上执行
开关
if
检查通常是一种反模式。@Someprogrammerdude是的,专门化看起来更好,因为我需要专门化静态断言,请参见答案。@Someprogrammerdude这不太正确。static_assert(false)可以与“if-else if-else”一起使用。@Someprogrammerdude static_assert(false)可以与MSVC2017一起使用,但与GCC不一起使用。你确定static_assert应该在“else”分支中吗?@AlexeyStarinsky-当然。否则它将是所有分支的一部分。此外,您的分支应该是一个
if-else if-else
链,这样才能工作。是的,如果存在“if-else if-else”,静态断言(false)就可以工作。所以答案是static_assert(false)。@AlexeyStarinsky-这就是为什么我没有建议
static_assert(false)
,而是要使条件也正式相关。你确定static_assert应该在'else'分支中吗?@AlexeyStarinsky-当然。否则它将是所有分支的一部分。此外,您的分支应该是一个
if-else if-else
链,这样才能工作。是的,如果存在“if-else if-else”,静态断言(false)就可以工作。所以答案是static_assert(false)。@AlexeyStarinsky-这就是为什么我没有建议
static_assert(false)
,而是让条件也正式相关。