关于constexpr

1.以下语句是错误的:

int i=5;
constexpr int ic=i;

constexpr期望得到一个常量的表达式,因此其初始化器必须是常量而不能是变量

2.用constexpr定义的指针是顶层而非底层的,即:它指向的地址是固定不变的。值得注意到是,在函数体内,变量的地址是可以改变的(即便它是常量)。只有函数体外的变量地址是不变的(即便它不是常量)。因此,以下语句是合法的:

int test(int n)
{
    n*=2;
    return n;
}

int t=5;
int a=test(t);

int main()
{
    constexpr int *p=&a;
    cout<<*p<<endl;
    return 0;
}

以上代码输出结果为10

时间: 2024-11-03 08:43:29

关于constexpr的相关文章

C++总结:C++中的const和constexpr

C++中的const可用于修饰变量.函数,且在不同的地方有着不同的含义,现总结如下. const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error. 对象的常量性可以分为两种:物理常量性(即每个bit都不可改变)和逻辑常量性(即对象的表现保持不变).C++中采用的是物理常量性,例如下面的例子: 1 2 3 4 5 6 7 struct A {     int *ptr; }; int k = 5, r = 6;

constexpr的用法

我的观点:今天有幸看到各位大神们在讨论constexpr的前途,有人说vs2010.2011.2012.2013都不支持,所以就觉得没用.好吧,我的世界中vs并不是不可获取,好吧,自己为了口头的胜利开始胡扯了.constexpr就像是一个告诉编译器,this is a const XXtype.但是各种有趣的实验证明了这个玩意还是有用的. 我来给你们验证一下: 1.如数一个数字,计算出它的!的结果(忘记叫什么了eg:5!==5*4*3*2*1==120) 1 //build-1234-Deskt

特殊用途语言特性:默认实参,内联函数和constexpr函数,调试帮助

重点: 1.三种函数相关的语言特性:默认实参,内联函数和constexpr函数. 2.默认实参:某些函数有一种形参,在函数的很多次调用中它们都被赋予一个相同的值. 3.一旦某个形参被赋予了默认值之后,它后面的所以形参都必须要默认值. 4.若想使用默认形参,只要在调用函数时省略该实参即可. Tip:Window = screen ( , , ‘?’ );//错误:只能省略尾部的实参! 5.对于函数的声明来说,习惯将其放在头文件当中,在给定的作用域中一个形参只能赋予一次默认实参. NOTE:通常,应

C++新标准:constexpr关键字

一.constexpr意义 将变量声明为constexpr类型以便由编译器来验证变量是否是一个常量表达式(不会改变,在编译过程中就能得到计算结果的表达式).是一种比const更强的约束,这样可以得到更好的效率和安全性. 二.constexpr用法 1.修饰函数 /*1.如果size在编译时能确定,那么返回值就可以是constexpr,编译通过*/ constexpr int getSizeA(int size) { return 4*size; } /*2.编译通过,有告警:在constexpr

C++11中的有趣的新特性(constexpr ) (Range-based for loop)

#include <iostream> #include<stdexcept> using namespace std; //constexpr keyword constexpr int sqare(int tmp) { return tmp*tmp; } int main() { int myArray[sqare(2)]={1,2,3,4}; //Range-based for loop for(int  &tmp : myArray) { tmp++; } for(

constexpr与指针

一. 常量表达式:是指值不会改变并且在编译过程就能得到的计算结果的表达式. 定义常量表达式变量: constexpr 变量类型 变量名: 例如: constexpr int mf=20://///20是常量表达式 constexpr int limit=mf+1://///mf+1是常量表达式 constexpr int sz=size()://////错误:size()只有到运行时才能获取到 二. 指针和引用都能定义为constexpr,但是他们的初始值却受到严格限制.一个constexpr指

C++之内联函数与constexpr

inline 函数 规模小,流程直接且频繁调用 cout<<shortString(s1,s2)<<endl; = cout<<(s1.size()<s2.size()?s1:s2)<<endl; constexpr函数是指能用于常量表达式的函数.函数的返类型及所有形参的类型都得是字面值类型,而且函数体中必须有一条return语句:

constexpr与常量表达式(c++11标准)

常量表达式(const expression):是指值不会改变并且在编译过程中就得到计算结果的表达式.(运行中得到结果的不能成为常量表达式). const int i=3;    //是一个常量表达式 const int j=i+1; //是一个常量表达式 int k=23;        //k的值可以改变,从而不是一个常量表达式 const int m=f(); //不是常量表达式,m的值只有在运行时才会获取. constexpr变量: C++11允许声明constexpr类型来由编译器检验

c++ 11 游记 之 decltype constexpr

title: c++ 11 游记 1 keyword :c++ 11 decltype constexpr 作者:titer1 zhangyu 出处:www.drysaltery.com 联系:1307316一九六八(仅接受短信) 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips for image: http://7xjs3n.com1.z0.glb.clouddn.com c+

[c++] constexpr and literal class

稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++? 2. int i; // not constant const int size = i; // fine! 可以,但为什么不在这里就先判断出问题的隐患呢? int arr[size]; // Error! 然而对于constexpr,则表明这个值不仅是constant的,而且也是编译期确定的 int i; // not constant constexpr int