C++关键字(持续更新ing)
前言
个人向记录,不全,有生之年,以上。
- 2024/12/09 首次更新
constexpr:常量表达式
constexpr最重要的意义是编译器优化,比如做模板类型推断时
constexpr:常量表达式,是一种编译器优化的手段
参考:https://www.cnblogs.com/fuzhe1989/p/3554345.html
constexpr是C++11中新增的关键字,其语义是“常量表达式”,也就是在编译期可求值的表达式。最基础的常量表达式就是字面值或全局变量/函数的地址或sizeof等关键字返回的结果,而其它常量表达式都是由基础表达式通过各种确定的运算得到的。constexpr值可用于enum、switch、数组长度等场合。
constexpr所修饰的变量一定是编译期可求值的,所修饰的函数在其所有参数都是constexpr时,一定会返回constexpr。
constexpr int Inc(int i) {
return i + 1;
}
constexpr int a = Inc(1); // ok
constexpr int b = Inc(cin.get()); // !error
constexpr int c = a * 2 + 1; // ok
constexpr还能用于修饰类的构造函数,即保证如果提供给该构造函数的参数都是constexpr,那么产生的对象中的所有成员都会是constexpr,该对象也就是constexpr对象了,可用于各种只能使用constexpr的场合。注意,constexpr构造函数必须有一个空的函数体,即所有成员变量的初始化都放到初始化列表中。
struct A {
constexpr A(int xx, int yy): x(xx), y(yy) {}
int x, y;
};
constexpr A a(1, 2);
enum {SIZE_X = a.x, SIZE_Y = a.y};
但是,也要注意,如果调用构造函数时有不定参数x,那么也不会报错,当作普通对象初始化
一个例子:
constexpr void f(){
int a = 0;
int * p = &a; // 对
}
static int b = 0;
int main(){
int a = 0;
constexpr int * p = &a; // 错,栈上变量的地址编译期是不能确定的
constexpr int * q = &b; // 对,静态存储区变量的地址是编译时就可确定的
}
inline
https://en.cppreference.com/w/cpp/language/inline
https://www.zhihu.com/question/419304773/answer/1453712022
inline曾经被用作内联函数,作为优化手段,但是现代c++(17及之后)并不是这样。
inline 现在表示在链接时遇到不同编译单元出现了相同签名的函数时,只保留一份。
比如说,头文件中定义的函数在多个源程序文件中被调用,inline标明这两个函数具有相同的签名。inline 关键字告诉编译器和链接器,这个函数可能在多个编译单元中定义,但它们实际上是相同的函数。在链接阶段,链接器只会保留一份函数定义。
#ifndef EXAMPLE_H
#define EXAMPLE_H
#include <atomic>
// function included in multiple source files must be inline
inline int sum(int a, int b)
{
return a + b;
}
// variable with external linkage included in multiple source files must be inline
inline std::atomic<int> counter(0);
#endif
-------------------------------------------
#include "example.h"
int a()
{
++counter;
return sum(1, 2);
}
-------------------------------------------
#include "example.h"
int b()
{
++counter;
return sum(3, 4);
}
noexcept
https://veitchkyrie.github.io/2020/02/24/C++-noexcept-运算符/
函数修饰符,指定不抛出异常
#include<iostream>
void BlockThrow() noexcept {
throw 1;
}
int main(void) {
try {
BlockThrow();
} catch(...) {
std::cout << "BlockThrow Found throw" << std::endl;
}
}
==== 输出:
terminate called after throwing an instance of 'int'
Aborted
auto
自动推导类型