请简单叙述C++中if函数的用法
根据 [zh.cppreference.com](https://zh.cppreference.com/w/cpp/language/if)，C++中的`if`语句是一种条件语句，它可以根据一个布尔表达式的值来执行或跳过一个子语句。基本的`if`语句的形式是：
```c++
if (condition) {
    statement
}
```
如果`condition`在转换到`bool`后为`true`，则执行`statement`；否则，跳过`statement`。

你还可以使用`else`子句来指定当`condition`为`false`时要执行的语句：

```c++
if (condition) { 
    statement1
} else {
    statement2
}
```

你也可以使用else if来链接多个条件判断：

```c++
if (condition1) {
    statement1
} else if (condition2) {
    statement2
} else {
    statement3
}
```

**从C++17开始**，你可以使用`if constexpr`来在编译时进行条件判断。这样，只有满足条件的分支会被实例化和编译，而不满足条件的分支会被丢弃。这对于模板元编程和静态断言很有用。例如：

```c++
template<typename T>
auto get_value(T t) {
    if constexpr (std::is_pointer_v<T>)
        return *t; // 如果T是指针类型，则解引用t并返回
    else
        return t; // 否则直接返回t
}
```

**从C++23开始**，你还可以使用`if consteval`和`if !consteval`来根据当前上下文是否是常量求值上下文来选择不同的分支。例如：

```c++
consteval std::uint64_t ipow_ct(std::uint64_t base, std::uint8_t exp)
{
    if (!base) return base;
    std::uint64_t res{1};
    while (exp)
    {
        if (exp & 1) res *= base;
        exp /= 2;
        base *= base;
    }
    return res;
}
 
constexpr std::uint64_t ipow(std::uint64_t base, std::uint8_t exp)
{
    if consteval // 使用编译时友好的算法
    {
        return ipow_ct(base, exp);
    }
    else // 使用运行时求值
    {
        return std::pow(base, exp);
    }
}
 
int main(int, const char* argv[])
{
    static_assert(ipow(0,10) == 0 && ipow(2,10) == 1024);
    std::cout << ipow(std::strlen(argv[0]), 3) << '\n';
}
```
为什么从C++17开始，C++针对if增加了一些编译期的特性？