c++一些已有好用功能

struct BitFields {
    int b : 4 {1}, d : 4 {2}, p : 4 {3}, q : 4 {4};
    //C++20:`位域`的默认成员初始化器
};
const auto [b, d, p, q] = BitFields{};
//结构化解绑定.

上面是位域

#include <iostream>
#include <string_view>
#include <source_location>
 
void log(string_view message,
         const source_location& location = source_location::current())
{
    cout << "info:"
        << location.file_name() << ':'
        << location.line() << ' '
        << message << '\n';
}
 
int main()
{
    log("你好");
}

C++源码位置用法.
declval转换T为引用.

非类型模板实参

template<class T>
struct X {
    X(T) {}
    auto operator<=>(const X&) const = default;
};//X作为模板参数.
template<X x> struct Y { };
Y<0> y; // OK , Y<X<int>(0)>

结构化绑定:

for (auto&& [a,b] : mymap) {
    // 使用a,b
}

常量初化:

struct S {
    static const int c;//可放只读节
};
const int d = 10 * S::c;//非常量表达式`:S::c`此前无初始化器,此初始化发生晚于常量初始化
const int S::c = 5;    //常量初始化,保证首先发生
数组<整,S::c>t;//可放编译时地方.

consteval立即函数(编译时运行的函数),每次调用该函数必须产生编译时常量.

consteval int sqr(int n) {
  return n*n;
}
constexpr int r = sqr(100);  // OK
 
int x = 100;
int r2 = sqr(x);  // 错误,调用不产生常量
 
consteval int sqrsqr(int n) {
  return sqr(sqr(n)); //在此点非常量表达式,但是`OK`
}
 
constexpr int dblsqr(int n) {
  return 2*sqr(n); // 错误:外围函数非`consteval`且`sqr(n)`不是常量
}

constexpr变量是类型,只读,在程序开始时初始化constinit变量,是类型,不能在运行时创建,变量不要求是类型.

指派初化器

struct A { int x; int y; int z; };
A a{.y = 2, .x = 1}; //错误:指派符的顺序不匹配声明顺序
A b{.x = 1, .z = 2}; // `OK:b.y`初始化为0
posted @   zjh6  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示