首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

constexpr 和 常量表达式

constexpr常量 c++11新标准规定,允许将变量声明为constexpr类型,用来由编译器来验证变量的值是否为一个常量表达式。...声明constexpr的变量一定是一个常量,而且必须用常量表达式初始化: constexpr int mf =20; // 20是常量表达式 constexpr int litter = mf+1;...不能使用普通函数作为constexpr变量的初始值。 一般来说,如果认定变量是一个常量表达式,那就把它声明成constexpr类型。...指针和constexprconstexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指对象无关: const int *p =null; // p是一个指向整形常量的指针...constexpr int *q= ptr; // q是一个指向整数的常量指针 constexpr指针既可以指向常量也可以指向一个非常量: constexpr int *p =null; //p

14530

性能优化利器之constexpr

好了,既然示例一(使用const)可以在编译期进行求值,而constexpr也可以在编译期求值,那么直接用constexpr替换示例一种的const是否可行?...那就是使用constexpr表达式: example4.cc constexpr int Add(const int a, const int b) { return a + b; } int...函数 constexpr也可以修饰普通函数或者成员函数,其实这块在上一节已经有提过,示例如下: constexpr int Add(const int a, const int b) { return...通过本示例,可以看出,将函数声明为constexpr可以提示效率,让编译器来决定是在编译阶段还是运行阶段来进行求值,当然了,如果想了解在编译阶段求值的各种细节规则,请参考constexpr in cppreference...自C++17起,引入了if constexpr语句,在本节中,将借助SFINAE 和 std::enable_if来实现一个简单的Square功能,最后借助if constexpr对代码进行优化(如果对

25110

C++ 关键字constexpr

constexpr 是 C++11 引入的一个关键字,用于指定表达式或函数的值在编译时就可以确定。使用 constexpr 可以在编译期进行优化,从而提高程序的运行效率。...以下是 constexpr 的详细解释: unsetunset1. 基本概念unsetunset constexpr 指定一个表达式或函数在编译时求值。 它可以用于变量、函数和类构造函数。...用于变量unsetunset 当 constexpr 用于变量时,该变量必须是一个常量表达式,即它的值在编译时就可以确定。 示例:constexpr int a = 5; unsetunset3....constexpr Point p(1, 2); unsetunset5....使用 constexpr 可能会增加编译时间,因为编译器需要在编译时执行更多的计算。 但是,由于计算是在编译时完成的,因此使用 constexpr 可以减少运行时的计算负担,从而提高程序的效率。

11410

constexpr和常量表达式

()是一个constexpr函数时,才是常量表达式,否则语句错误 constexpr指针 需要注意的是,与const关键字不同,一个指针被定义为constexpr,关键字仅对指针有效,与指针所指的对象无关...int i = 3; constexpr int *p = &i; constexpr函数 constexpr函数(constexpr expression)是指能用于常量表达式的函数。...++14中极大放宽了对constexpr函数的定义限制 执行对constexpr函数的初始化时,编译器把对constexpr函数的调用替换成其结果值。...constexpr构造函数 尽管构造函数不能是const的,但是字面值常量类的构造函数可以是constexpr函数。事实上,一个字面值常量类必须至少提供一个constexpr构造函数。...constexpr构造函数必须初始化所有数据成员,constexpr构造函数保证了传递给它的所有参数都是constexpr类型的,产生的对象的所有成员也都是constexpr

35810

C++Rust 元编程之 BrainFuck 编译器(constexpr 过程宏解法)

原文地址:C++/Rust 元编程之 BrainFuck 编译器(constexpr/ 过程宏解法) 引子 接上一篇C++ 元编程之 BrainFuck 编译器(模板元解法)挖了个坑:用constexpr...C++版本: // compile time constexpr auto res = brain_fuck(R"( ++++++++[>++++[>++>+++>+++>++>+...C++ constexpr解法 其实模板元解法和constexpr解法能力相同,只是实现代价不同,后者更容易实现,写起来就像普通函数一样。...毕竟C++20之前constexpr不支持动态分配内存,像链表这种随时扩容的方式暂时不可行。...C++版本实现过程中可以先不加constexpr关键字,通过打印等debug手段调试通过后,最终加上constexpr关键字即可,最后既可以在运行时使用,也可以在编译时使用。

96740

C++ 中 const 和 constexpr关键字解析:常量、函数和指针

所以为了避免意外修改导致实参的值发生改,通常会采用const加上引用的方式传递参数 void test(const Student &s) { ... } constexpr关键字 constexpr...不过在后续的C++14/17/20标准中进一步的放宽了这了限制,都可以通过编译了 constexpr int test() { return 1 + 1; } 修饰构造函数 constexpr还可以用于修饰自定义类型...,不过有一个前提条件,就是该自定义类型具有constexpr修饰的构造函数,并且该构造函数不能有具体实现,否则会编译报错 class Student { public: constexpr...const_cast类型转换来修改值,而constexpr是不可以修改的,其实可以将const理解为只读变量更符合其含义 const只能用于非静态成员函数,而constexpr可以和成员,非成员,构造函数一起使用...再有常量表示的场景,尽可能的加上constexpr来让编译期进行计算 但是大面积的constexpr也会面临相应的增加编译时间的风险 最后 看完如果觉得有帮助,欢迎 点赞、收藏、关注

67020

expr_const在函数前与函数后的区别

目录 一、常量表达式 二、constexpr变量 三、constexpr函数 四、字面值类型 五、指针和constexpr 六、字面值常量类 参考 一、常量表达式 常量表达式(const expression...constexpr int mf = 20; //20是常量表达式 constexpr int limit = mf + 1; //mf + 1是常量表达式 constexpr int sz...= size(); //只有当size是一个constexpr函数时才是一条正确的声明语句 size()函数也需要constexpr修饰,成为constexpr函数。...三、constexpr函数 constexpr函数指能用于常量表达式的函数。定义constexpr函数有几项约定: 函数的返回值类型及所有的类型都得是字面值类型。...五、指针和constexpr (1)如果在constexpr声明中定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。

73530

通过OpenFoam记录一些c++的trick(持续更新)

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构造函数必须有一个空的函数体,即所有成员变量的初始化都放到初始化列表中。 假如你将一个成员函数标记为constexpr,则顺带也将它标记为了const。...如果你将一个变量标记为constexpr,则同样它是const的。但相反并不成立,一个const的变量或函数,并不是constexpr的。

46120
领券