C++11系列 常量表达式constexpr

C++11 constexpr和const的区别详解 我们知道,constexpr 是 C++ 11 标准新添加的关键字,在此之前(C++ 98/03标准)只有 const 关键字,其在实际使用中经常会表现出两种不同的语义。举个例子: #include <iostream> #include <array> using namespace std; void dis_1(const int x) { //错误,x是只读的变量 array <int,x> myarr{1,2,3,4,5}; cou 阅读详情

转载自:http://towriting.com/blog/2013/09/17/constexpr/

C++11有一些这样的改善,这种改善保证写出的代码比以往任何时候的执行效率都要好。这种改善之一就是生成常量表达式,允许程序利用编译时的计算能力。假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单。假如你不知道模板元编程,也没什么。constexpr使我们很容易利用上编译时编程的优势。

常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时。需要计算一个编译时已知的常量,比如特定值的sine或cosin?确实你亦可以使用库函数sin或cos,但那样你必须花费运行时的开销。使用constexpr,你可以创建一个编译时的函数,它将为你计算出你需要的数值。用户的电脑将不需要做这些工作。

constexpr初探

为了使函数获取编译时计算的能力,你必须指定constexpr关键字到这个函数。

constexpr int multiply (int x, int y)
{
    return x * y;
}

// 将在编译时计算
const int val = multiply( 10, 10 );

除了编译时计算的性能优化,constexpr的另外一个优势是,它允许函数被应用在以前调用宏的所有场合。例如,你想要一个计算数组size的函数,size是10的倍数。如果不用constexpr,你需要创建一个宏或者使用模板,因为你不能用函数的返回值去声明数组的大小。但是用constexpr,你就可以调用一个constexpr函数去声明一个数组。

constexpr int getDefaultArraySize (int multiplier) {
        return 10 * multiplier; }

int my_array[ getDefaultArraySize( 3 ) ];

constexpr函数的限制

一个constexpr有一些必须遵循的严格要求:

  • 函数中只能有一个return语句(有极少特例)
  • 只能调用其它constexpr函数
  • 只能使用全局constexpr变量

注意递归并不受限制。但只允许一个返回语句,那如何实现递归呢?可以使用三元运算符(?:)。例如,计算n的阶乘:

constexpr int factorial (int n)
{
    return n > 0 ? n * factorial( n - 1 ) : 1;
}

现在你可以使用factorial(2),编译器将在编译时计算这个值,这种方式运行更巧妙的计算,与内联截然不同。你无法内联一个递归函数。

constexpr函数还有那些特点?

一个constexpr函数,只允许包含一行可执行代码。但允许包含typedefs、 using declaration && directives、静态断言等。

constexpr和运行时

一个声明为constexpr的函数同样可以在运行时被调用,当这个函数的参数是非常量的:

int n;
cin >> n;
factorial( n );

这意味着你不需要分别写运行时和编译时的函数。

编译时使用对象

假如你有一个Circle类:

class Circle {
    public:         Circle (int x, int y, int radius) : _x( x ), _y( y ), _radius( radius ) {}         double getArea () const
    {
        return _radius * _radius * 3.1415926;
    }     private:             int _x;             int _y;             int _radius; };

你希望在编译期构造一个Circle接着算出他的面积。

constexpr Circle c( 0, 0, 10 );
constexpr double area = c.getArea();

事实证明你可以给Circle类做一些小的修改以完成这件事。首先,我们需要将构造函数声明为constexpr,接着我们需要将getarea函数声明为constexpr。将构造函数声明为constexpr则运行构造函数在编译期运行,只要这个构造函数的参数为常量,且构造函数仅仅包含成员变量的constexpr构造(所以默认构造可以看成constexpr,只要成员变量都有constexpr构造)。

class Circle {     public:         constexpr Circle (int x, int y, int radius) : _x( x ), _y( y ), _radius( radius ) {}         constexpr double getArea ()
    {
        return _radius * _radius * 3.1415926;
    }
 private:             int _x;             int _y;             int _radius; };

constexpr vs const

假如你将一个成员函数标记为constexpr,则顺带也将它标记为了const。如果你将一个变量标记为constexpr,则同样它是const的。但相反并不成立,一个const的变量或函数,并不是constexpr的。

constexpr和浮点数

到这里我们讲到的constexpr功能都可以通过模板元编程实现。但constexpr支持的一项能力是可以计算浮点型的数据。因为double和float不是有效的模板参数,你不可以轻易的通过模板编译期计算浮点数的值。而constexpr允许编译期计算浮点型数据。

权衡constexpr

C++开发者早就深受修改一个头文件则引发重新编译导致编译缓慢的困扰。而constexpr可能引入增加编译时间的风险,但也有一些技术去降低这种风险。首先,因为constexpr函数相同的参数会输出相同的结果,所以它们可以被memoized,事实上GCC已经支持memoization。

因为可以对constexpr函数memoize,所以用constexpr函数替换模板函数的地方,(编译)性能不会变得更坏,但代码会变得清晰。事实上,替换掉一部分模板实例,编译会显著加快。

最后,标准允许编译器去限制递归函数的级数。这样可以限制深度递归的编译性能损耗。

编译器支持

constexpr需要编译器支持编译期的递归,所以也不奇怪支持constexpr的编译器并不多,就我所知只有G++4.7支持这一特性。[注:到我翻译时,intelC++13、Clang3.1也都支持了,不过Vs2013还是不支持]

C++11 新特性:常量表达式 constexpr(上) 常量表达式(Constant Expression)指的是值在编译时就已经确定,并且在程序执行过程中不会改变的表达式。在 C++ 中,常量表达式可以用于定义编译时常量、数组的大小、整型模板参数、编译时断言等场合,是提高程序效率、实现编译时计算的重要工具。 阅读详情

相关推荐

c++11新特性-constexpr

constexpr和class constexpr还能够声明用户自定义类型;int main()以上代码自定义了一个结构体X,并且使用constexpr声明和初始化了变量x。//无法在编译期计算解决上述问题的方法很简单,只需要用constexpr声明X类的构造函数,也就是声明一个常量表达式构造函数,当然这个构造函数也有一些规则需要遵循。

SuperYang_的博客 1055

QT5.9编译打包一个项目 msvc2015对未定义的函数或为未声明为“constexpr”的函数的调用导致了故障

注意:不要有空格与中文路径 一、下载QT5.9https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.0/qt-opensource-windows-x86-5.9.0.exe 二、安装 勾这3项:具体解释看这里,msvc2015可以不勾,我别的地方要用。 MinGW 5.3.0 32 bit 编译器模块。MinGW 是 Minimalist GNU for Windows 的缩写,MinGW 是 Windows 平台上使用的 ..

chenhao0568的专栏 2783

ISP 基础知识储备

ISP(image signal processing),图像信号处理芯片,在手机摄像头和车载摄像头等领域有着广泛应用,是图像信号处理的核心芯片。 ISP pipeline 流程图如下: 光线经过lens镜头,投射到sensor上,经过光电转换成模拟电信号,再由A/D转换成数字信号,交给ISP芯片进行一系列的处理,在LENS部分也需要进行镜头校正、颜色矫正等一些操作。 然后,得到的bayer ...

qq_39444290的博客 777

函数未声明导致的错误

函数未声明导致的错误 对于一个合格的程序员来说,在进行函数调用前必须要对函数进行声明,应该是最基本的知识。而且现在的编译器都自带一定的代码检查功能,对于函数在调用前未声明的情况,在编译时都会提示告警信息,来提示开发人员相关的代码缺陷。 但通常在写测试代码时,程序员一般会比较随意,不一定会严格按照编程规范去写代码,因此经常会出现省略函数声明的操作,而在编译时,对编译器提示的告警信息也会忽略,这时候就会出现一种类型的bug。那就是函数返回指针时,指针的类型会被编译器设置成默认类型,也就是整型(integer)。

DSP小胖的博客 4740

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正

基于ENVI5.3的Landsat条带去除、辐射定标、大气校正坏带修复辐射定标大气校正 坏带修复 1.下载landsat_gapfill插件,放入“安装目录\Exelis\ENVI53\extensions”,重启ENVI 2. 加载拟处理文件(MTL.txt格式) 3.打开landsat_gapfill 4.选择存放位置并命名文件 5.选择处理文件 辐射定标 1.选择工具Radiometric Calibration 2.选择已修复坏带文件 3.修改参数,选择输出位置及命名文件 大气校正 1

u010198950的博客 1万+

PNG编解码算法详解

1.PNG介绍 PNG是便携式网络图型( Portable Network Graphics)的缩写,由于PNG带有透明通道,无损压缩,可提升设计元素的呈现效果,因此设计上对PNG情有独钟,广泛的运用在设计、游戏、网页、app开发里,实际使用上由于存在很多误区,导致被滥用,这里对之前学习png的心得做个整理。 首先,PNG和诞生跟GIF格式有较大关系,这中间有很多趣事,可自行查阅。PNG的压缩过程是完全无损的,压缩过的文件可以准确的还原出原图,可封装多种pixfmt格式的数据,并且是一种可扩展的封装格式,

lemonHe的博客 1万+

C++11系列-常量表达式

http://towriting.com/blog/2013/09/17/constexpr/ C++11系列-常量表达式 2013-09-17 C++11有一些这样的改善,这种改善保证写出的代码比以往任何时候的执行效率都要好。这种改善之一就是生成常量表达式,允许程序利用编译时的计算能力。假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单。假如你

我用CV我自豪。 1209

AI办公Agent技术:文档与表格智能处理实践

办公自动化技术正从规则驱动转向语义理解,大语言模型(LLM)为办公Agent赋予了智能决策能力。这类系统通过五层架构整合自然语言处理、工具API调用和任务规划引擎,能自动完成文档分类、表格分析等高重复性工作。关键技术包括基于TF-IDF和BERT的特征提取、Excel公式自动生成等,在财务报告、法律审查等场景可实现90%以上的效率提升。随着多模态能力和领域专业化发展,办公Agent正在重塑企业文档处理流程,成为数字化转型的核心基础设施。

weixin_30263277的博客 519

在windows命令行编译Qt程序并纠错

目录00、编译环境01、在电脑任意位置新建HelloWorld目录,里面编写HelloWorld.cpp代码,代码如下02、打开vs2017的命令行03、qmake -project,生成pro文件04、qmake,生成Makefile05、nmake,生成可执行程序06、运行 00、编译环境 VS2017 QT5.9.4 01、在电脑任意位置新建HelloWorld目录,里面编写HelloWo...

wkd_007的博客 3001

用友YonSuite产品实操手把手教学(图文版)

用友YonSuite

ct341688的博客 8154

第十六篇:Camx IFE 、OPE 各 port口功能定义

需要注意的是,类似 CSLTFEPortIdRawDump 是没有downscale功能的,所以如果遇到fov不正确的问题,可以排除下TFE这边的 output port是否被接到了 CSLTFEPortIdRawDump 上面来。我们知道Camx 的IFE 、OPE有不少的output port,各个port是有哪些功能的呢?老一点的框架平台,采用的TEF、OPE。

231

C++11关键字constexpr看这篇就够了

一、在普通函数中的使用 例如下面的代码, 数组的大小必须是常量,在声明数组array时,用函数返回值,此时会报错: error C2131: 表达式的计算结果不是常数 note: 对未定义的函数或为未声明为“constexpr”的函数的调用导致了故障 用constexpr关键字可以解决这种问题,在GetLen函数前加constexpr声明,代码如下: 当然,constexpr修饰的函数也有一定的限制:  (1)函数体尽量只包含一个return语句,多个可能会编译出错; ...

琅嬛福地 5万+

LeRobot 入门教程(十)LIBERO 机器人终身学习评估

LIBERO是一项专注于机器人终身学习(LLDM)的基准测试平台,包含130项任务,分为5大套件(空间推理、物体操作、目标约束等)。LeRobot框架已集成LIBERO,支持单/多套件评估,并兼容SmolVLA模型。训练需使用预处理数据集(HuggingFaceVLA/libero),观测数据需符合规范(8维状态+双摄像头图像)。该平台采用MuJoCo模拟,支持无头服务器运行,旨在推动机器人持续学习算法的发展与标准化评估。

2506_90492529的博客 1662

C++11语法杂记(更新中)

C++11新语法

m0_72563041的博客 411

26版SPSS操作教程(高级教程第十章)

#大道之行,在于坚持 #本期内容:二分类Logistic回归模型 #由于导师最近布置了学习SPSS这款软件的任务,因此想来平台和大家一起交流下学习经验,这期推送内容接上一次高级教程第九章的学习笔记,希望能得到一些指正和帮助~

你好! 1598

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++11新特性

C++11特性大全

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 1052

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++知识整理系列(三)—— constexpr常量表达式

const修饰常量,但是const并未区分编译时常量和运行时常量,而constexpr则只能是编译时常量,在C++11中提出。 这篇文章,将详细讲解constexpr。 一、常量表达式 常量表达式(const expression):指值不会改变并且在编译阶段过程就能得到计算结果的表达式。 以下两种是常量表达式: const int maxSize = 10; const int limit = maxSize + 1; 以下两种不是常量表达式: int staff_size = 27; cons..

aruewds的博客 5835

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++11之常量表达式(const与constexpr的区别)

C++11标准要求,编译时的浮点数常量表达式的精度必须大于等于运行时的浮点数常量的精度(为了解决浮点数精度丢失问题)。当我们在添加了常量表达式构造函数后就必须要添加非常量表达式构造函数的版本,因为常量表达式构造函数也可用于非常量表达式中的类型构造。所以,在使用这个常量数值创建数组时编译失败,当作枚举成员赋值也编译失败,作为swicth中的case 分支也会编译错误。规定,当声明为常量表达式的模板后,某个该模板的实例化结果不满足常量表达式的要求后,是一个常量表达式,所以编译器进行编译时就会计算出函数的值。

林夕07 1842

[C++11] constexpr 完整解析

constexpr是C++11标准引入的一个关键字,旨在支持编译时常量表达式的计算。constexpr的主要目的是提高程序性能,通过在编译时计算常量值来减少运行时的计算负担。这个特性使得程序员能够编写更加高效和可读的代码,并且能够利用编译器进行更多的优化。

wangdsh的博客 3589

C++11新特性之常量表达式 constexpr

1 常量表达式在C++11中引入了一个新的关键字“constexpr”,用来修饰一个函数或者变量使其变成一个常量表达式或值。比如下面的代码将函数GetConstValue变成一个常量表达式,并用这个常量表达式声明一个数组:constexpr int GetConstValue() {return 10;}; int a[GetConstValue()];有了constexpr关键字,编译器就可以在...

姜的理想国 3156

【C++】const与constexpr详解

常量表达式函数在使用前,必须要有该函数的定义。

lemonxiaoxiao的博客 1万+

C++学习:C++11扩展:constexpr特性

之前我们已经学习了C++11的一些特性。那些十分重要。C++11对于C++整个的发展也是转折性的,受限于篇幅限制我们并没有完全讲完,本期我们就来学习C++11的其他特性。

2401_89119815的博客 1171

C++11之constexpr

介绍了C++11中新增的关键字constexpr

talk less, code more 1243

C++11 新特性 常量表达式 constexpr

为了解决常量无法确定的问题,C++11在新标准中提出了关键字constexpr,它能够有效地定义常量表达式,并且达到类型安全、可移植、方便库和嵌入式系统开发的目的。

Lyajpunov的博客 726

C++ constexpr 常量表达式

概括 在C++11中引入了 constexpr 关键字. 意思是常量表达式, 详细来说就是在编译期可求值的表达式. 可以修饰表达式, 函数, 构造函数, 类等… 可以让编译器做出尺度更大的优化. 常量表达式的概念 这个关键字是为了解决以前的 const 关键字带来的一些问题, 其实在代码实战中 const 显然是只有readonly只读这个概念, 其在很多场合上并不符合逻辑常量这个概念, 就比如说: const int f(){ return 1; } int main(){ int arr[f()]

夢裡夢到醒不來的夢 823

C++11:constexpr & 编译期性质

讲解C++11编译期性质,包括constexpr以及自定义字面量,静态断言

博客网站 https://async-area.com 1531
上一篇: C++11系列 Lambda表达式用法
下一篇: C++11系列 使用emplace
CoderAldrich
博客等级 码龄12年 431粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值