首页
学习
活动
专区
圈层
工具
发布

现代C++之constexpr

现代C++之constexpr constexpr在 C++11 引入、在 C++14 得到大幅改进。...(2)C++14中只要保证返回值和参数是字面值就行了,函数体中可以加入更多的语句,方便了更灵活的计算。 它的字面意思是 constant expression,常量表达式。...1.变量 const与constexpr可以应用到变量和函数。尽管它们彼此相似,但实际上它们是非常不同的概念。 const与constexpr意味着他们的值不能在初始化后改变。...这是因为 ODR(下面的one definition rule)-use 的类静态常量也需要有一个定义,在没有内联变量之前需要在某一个源代码文件(非头文件)中这样写: const int magic::...前者可行的原因是,类的静态 constexpr 成员变量默认就是内联的。const 常量和类外面的 constexpr 变量不默认内联,需要手工加 inline 关键字才会变成内联。

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++中auto关键字的用法详解

    2.auto使用细则 auto与指针和引用结合起来使用 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须 加& int main() { int x.... auto不能推导的场景 auto不能作为函数的参数 因为编译器无法对a的实际类型进行推导 auto不能直接用来声明数组 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法...auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有 lambda表达式等进行配合使用。...下面详细介绍这些更新: C++14中对auto的更新 返回类型推导: 在C++14中,auto可以用于推导普通函数的返回类型。...类型的常量N,然后返回乘积。

    83710

    Modern c++快速浅析

    const,保留底层const(顶层const:指针本身是常量,底层const:指针所指对象是常量),这点与模板类型推导一致 int* const apc = &a; const int* acp =...// 非法 auto b{ 1 }; // int auto c = { 1, 2, 3 }; // 与C++14相同,皆为std::initializer_list auto d = {...1 }; // 与C++14相同,皆为std::initializer_list 返回值推导 将函数的返回值标记为auto,意味着返回值类型的推导遵循模板类型推导的原则,而非auto的推导原则 C...decltype auto与decltype都是C++11引入的类型推导。...,可以使用noexcept修饰[]() noexcept { /* 函数语句 */ }•当Lambda表达式没有捕获任何参数时,它可以转换成为一个函数指针•Lambda中可以直接使用静态变量以及全局变量

    79910

    C++11 decltype 的用法

    模版案例 更多细节问题 C++14 取消 decltype 其他 decltype 的意义 ---- 参考博客:C++11新标准:decltype关键字 有时我们希望从表达式的类型推断出要定义的变量类型...,但是不想用该表达式的值初始化变量(如果要初始化就用auto了)。...而编译时类型推导,除了我们说过的auto关键字,还有本文的decltype。 decltype与auto关键字一样,用于进行编译时类型推导,不过它与auto还是有一些区别的。...decltype的类型推导并不是像auto一样是从变量声明的初始化表达式获得变量的类型,而是总是以一个普通表达式作为参数,返回该表达式的类型,而且decltype并不会对表达式进行求值。...decltype 的用法 ---- 1.

    33640

    机器人CPP编程基础-02变量Variables

    常量:常量是变量的特殊类型,表示一个不可变的值。在C++中,使用关键字const来声明常量。 变量的类型转换:在C++中,可以进行隐式类型转换和显式类型转换。...C++14是C++语言的最新标准,它引入了一些关于变量的新特性和改进。以下是一些关于C++14中变量的详细介绍: auto关键字:C++14引入了auto关键字,用于自动推断变量的类型。...使用auto关键字可以简化变量的类型声明,特别是在使用复杂表达式或嵌套容器时。...:C++14引入了通用委托表达式(Generalized Delegate Expressions),允许使用更灵活的表达式来构造委托表达式。...静态断言:C++14引入了静态断言(Static Assert),用于在编译时检查条件是否满足。如果条件不满足,编译器将产生错误或警告。

    42730

    【云+社区年度征文】C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧

    C++14在标准库里添加了一个很有意思的元函数,std::integer_sequence。...在C++14的加持下,它可以帮助我们完成在编译期间获取了一组编译期整数。系好安全带,准备发车,和大家聊聊C++14带来的新黑魔法:std::make_index_sequence。...在C++之中有一个很常见的需求,定义一组编译期间的数组作为常量,并在运行时或者编译时利用这些常量进行计算。现在假如我们需编译期的一组1到4的平方值。你会怎么办呢? 嗯.......1.2 做个解释 我们来拆解一下1.1的代码,首先我们定义了一个constexpr的静态函数const_nums。...接下来将介绍它最为重要的使用场景:与tuple的结合。 现在请大家思考一个问题:如何遍历一个std::tuple。

    65200

    C++14新特性扫盲探究

    闲暇之时,聊到C++14,实际上C++14相对之前的11并没有太大的改动,或者说更像C++11标准基础上的查漏补缺,C++14之后,还有17、20甚至23,所以说,C++14更像个过渡版本。...constexpr(常量表达式):允许在编译时计算常量表达式的值,提高代码的性能和效率。auto类型推断:可以使用auto关键字来自动推断变量类型,简化代码并提高代码可读性。...模块系统:C++14引入了模块系统,可以将代码分解为更小的、可重用的部分,提高代码的可维护性和可重用性。...其他改进:std::chrono(时间库):C++14引入了std::chrono库,提供更灵活的时间处理功能。...类型转换(Type conversions):C++14改进了类型转换规则,提高了代码的可靠性和性能。std::thread(线程库):C++14提供了更强大的线程库,支持更多的线程操作和同步机制。

    99600

    C++17常用新特性(六)---lambda表达式的扩展

    从C++11起就引入了lambda表达式,C++14又对其进行了丰富,开始支持使用泛型lambda。到现在的C++17 lambda的功能又进行了扩展。...在C++17新特性中,主要支持了以下两种场景: 在常量表达式中使用 需要对当前对象的拷贝时使用,如不同的线程需要创建不同的对象。...这些上下文环境主要包含的场景有:只使用字面变量、没有静态类型、没有虚函数、没有异常捕获及new/delete的上下文环境。...}; return 0; } 如果要在表达式中指明返回值类型,可以按照如下方式编写代码: int main(){ auto squar = [](auto val) constexpr...但是在C++14中,提出了一个解决方案,代码可以修改成如下所示: void foo() const { auto Type1 = [thisCopy=*this] {std::cout << thisCopy.name

    1.1K20

    C++中const和constexpr的区别:了解常量的不同用法

    在编译时进行常量折叠和替换。三、constexpr关键字的用法和特点constexpr关键字用于声明变量和函数为编译时常量表达式。它可以用于在编译时求值,以及在运行时提供常量值。...与const变量不同,constexpr变量的值在编译时即确定,因此可以作为编译时常量来使用。...在 C++11 中,constexpr 主要用于声明常量,而在 C++14 中,constexpr 进一步扩展到了函数,允许对常量表达式进行计算。...constexpr 成员函数可以在编译时求值,适用于一些固定值的计算,在 C++14 中可以用 constexpr 成员函数替换类中的静态常量成员。...在 C++11 中,constexpr 主要用于常量表达式,而在 C++14 中,扩展到了允许对更复杂的函数进行编译时求值。

    54410

    Modern C++,学炸了!!

    程序编译过程,静态链接库和动态链接库 static、const、#define的用法和区别 C和C++区别 内存中的栈和堆分配 C++ 面向对象语法 访问限定符 public/protected/private...pimpl 惯用法 内存溢出和内存泄漏 STL标准模板库 迭代器、空间配置器理解 常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmap 内容有点多,...),改进或者增强了C++ 98/03标准中一些语法元素的用法(如auto 关键字、统一类的初始化列表语法),新增了一些其他编程语言早已经支持的关键字和语法(如final关键字、=default语法 、=...所以,与之前的 C++ 版本相比,C++11 更像一门新的语言。 4.2 C++14 的改动 C++14 是一个变动比较小的版本,主要是对 C++11 的新特性做了一些完善或者修正一些小的错误。...但是上面的公式中,在一个逗号表达式中 auto __begin = begin-expr, __end = end-expr; 由于只使用了一个类型符号 auto 导致起始迭代子 __begin 和结束迭代子

    3.7K10

    Effective Modern C++翻译(4)-条款3:了解decltype

    我们从典型的例子开始,因为它的结果都是在我们预料之中的,和模板类型推导与auto类型推导相比(参见条款1和条款2),decltype几乎总是总是返回变量名或是表达式的类型而不会进行任何的修改 const...既然这样的话,使用模板类型推导规则推导authAndAccess的返回类型是有问题的,但是auto类型推导规则也好不了多少,困难源自他们对左值表达式的处理。...(除非是一个的常量左值引用,但本例中不是这样的) 无可否认,传递一个右值的容器给authAndAccess是一个边界情况,一个右值的容器,作为一个临时对象将会在包含authAndAccess的函数调用的语句结束后被摧毁...在C++11中,这仅仅会会让人有些奇怪,但是结合C++14中对decltype(auto)的支持后,你对返回语句的一些简单的变化会影响到函数最终推导出的结果。...C++14提供了decltype(auto)的支持,比如auto,从它的初始化式中推导类型,但使用decltype的推导规则。

    93590

    深入解析C++的auto自动类型推导

    (2)语句中auto被推导为const int,ci的类型为const int &,因为ci是对cx的引用,而cx是一个const修饰的常量,因此对它的引用也必须是常量引用。...expr是条件表达式语句 当expr是一个条件表达式语句时,条件表达式根据条件可能返回不同类型的值,这时编译器将会使用更大范围的类型来作为推导结果的类型,如: auto i = condition ?...如果你用auto来替代上面的定义,则完全可以避免这样的问题发生,如: for (const auto& p : m) {} 新标准新增功能 自动推导函数的返回值类型(C++14) C++14标准支持了使用...使用auto声明lambda的形参(C++14) C++14标准还支持了可以使用auto来声明lambda表达式的形参,但普通函数的形参使用auto来声明需要C++20标准才支持,下面会提到。...虽然不能支持声明非静态数据成员,但却可以支持声明静态数据成员,在C++17标准之前,使用auto声明静态数据成员需要加上const修饰词,这就给使用上造成了不便,因此在C++17标准中取消了这个限制:

    79320

    C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧

    C++14在标准库里添加了一个很有意思的元函数: std::integer_sequence。...在C++之中有一个很常见的需求,定义一组编译期间的数组作为常量,并在运行时或者编译时利用这些常量进行计算。现在假如我们需编译期的一组1到4的平方值。你会怎么办呢? 嗯.......1.2 做个解释 我们来拆解一下1.1的代码,首先我们定义了一个constexpr的静态函数const_nums。...接下来将介绍它最为重要的使用场景:与tuple的结合。 现在请大家思考一个问题:如何遍历一个std::tuple。...(不能使用C++17的std::apply) 这个时候就要再次请出我们今天的主角,使用std::make_index_sequnce和lambda表达式来完成这个工作了。

    2.2K20

    C++:Lambda表达式

    若变量满足下列条件,则 lambda 表达式能使用而不捕获它 为非局部变量,或拥有静态或线程局域存储期(该情况下不能捕获该变量),或 为以常量表达式初始化的引用。...若变量满足下列条件,则 lambda 表达式能读取其值而不捕获它 拥有 const 而非 volatile 的整数或枚举类型,并已用常量表达式初始化,或 为 constexpr 且为可平凡复制构造。...(C++14 起) specifiers - 可变规范(可选)。 可选的指定符序列。...,但是在 Lambda 表达式中传递参数还有一些限制,主要有以下几点: 参数列表中不能有默认参数(C++14 起, lambda 能拥有自身的默认参数) 不支持可变参数 所有参数必须有参数名 虽然参数列表中不支持默认参数...普通函数和 lambda 表达式的主体均可访问以下变量类型: 从封闭范围捕获变量 参数 本地声明变量 当在类中声明类数据成员,this 可以被捕获 具有静态存储持续时间的任何变量(例如,全局变量) 4.

    1.2K52

    C++ 的发展

    C++14 主要增强了 C++11 中的特性,如 Lambda 表达式的泛型支持、std::make_unique 的引入、decltype(auto) 的改进等。...Lambda 表达式: 使用 std::for_each 算法与 lambda 表达式结合,计算容器中所有元素的总和。...C++ 2014: C++14 小幅增强: constexpr 的改进:支持更复杂的编译时常量计算。 二进制字面量:引入了支持二进制常量字面量。...Lambda 表达式的返回类型推导: 在 C++14 中,Lambda 表达式可以通过 auto 关键字自动推导返回类型。这避免了在 Lambda 表达式中手动指定返回类型的需要。...+14 的优势: 增强的类型推导:通过 auto、decltype(auto)、泛型 Lambda 表达式等新特性,C++14 提供了更加灵活和精简的编程体验。

    1.5K10
    领券