淘宝运营跟做网站哪种工资高宜昌做网站的公司
淘宝运营跟做网站哪种工资高,宜昌做网站的公司,如何建设合法的网站,找人做网站排名constexpr 是 C 11 标准新添加的关键字#xff0c;在此之前#xff08;C 98/03标准#xff09;只有 const 关键字#xff0c;其在实际使用中经常会表现出两种不同的语义#xff08;常量和只读#xff09;。 dis_1() 函数中的“const int x”只是想强调 x 是一个只读的变量…constexpr 是 C 11 标准新添加的关键字在此之前C 98/03标准只有 const 关键字其在实际使用中经常会表现出两种不同的语义常量和只读。 dis_1() 函数中的“const int x”只是想强调 x 是一个只读的变量其本质仍为变量无法用来初始化 f 数组
而 dis_2() 函数中的“const int x”表明 x 是一个只读变量的同时x 还是一个值为 5 的常量所以可以用来初始化 f 数组
C 11标准中为了解决 const 关键字的双重语义问题保留了 const 表示“只读”的语义而将“常量”的语义划分给了新添加的 constexpr 关键字。因此 C11 标准中建议将 const 和 constexpr 的功能区分开即凡是表达“只读”语义的场景都使用 const表达“常量”语义的场景都使用 constexpr。
在上面的实例程序中dis_2() 函数中使用 const int x 是不规范的应使用 constexpr 关键字。 #include iostream
using namespace std;
int main()
{int a 10;const int con_b a;cout con_b endl;a 20;cout con_b endl;
}
程序中用 const 修饰了 con_b 变量表示该变量“只读”即无法通过变量自身去修改自己的值。但这并不意味着 con_b 的值不能借助其它变量间接改变通过改变 a 的值就可以使 con_b 的值发生变化。
在大部分实际场景中const 和 constexpr 是可以混用的
const int a 5 4;
constexpr int a 5 4;
它们是完全等价的都可以在程序的编译阶段计算出结果。但在某些场景中必须明确使用 constexpr
#include iostream
#include array
using namespace std;constexpr int sqr1(int arg){return arg*arg;
}const int sqr2(int arg){return arg*arg;
}int main()
{arrayint,sqr1(10) mylist1;//可以因为sqr1是constexpr函数arrayint,sqr2(10) mylist1;//不可以因为sqr2不是constexpr函数return 0;
}
其中因为 sqr2() 函数的返回值仅有 const 修饰而没有用更明确的 constexpr 修饰导致其无法用于初始化 array 容器只有常量才能初始化 array 容器。
总的来说在 C 11 标准中const 用于为修饰的变量添加“只读”属性而 constexpr 关键字则用于指明其后是一个常量或者常量表达式编译器在编译程序时可以顺带将其结果计算出来而无需等到程序运行阶段这样的优化极大地提高了程序的执行效率。但是获得在编译阶段计算出结果的能力并不代表constexpr修饰的表达式一定会在程序编译阶段被执行具体的计算时机还是编译器说了算。 另外
1、
当一个函数被多个源文件包含时如果函数的定义不是constexpr而是普通的int返回类型就会导致重定义错误。
这是因为普通的函数定义会在每个源文件中生成一份副本从而导致重复定义的错误。
而当函数的返回类型是constexpr int时编译器会将该函数视为一个可以在编译时求值的常量表达式。在编译时编译器会对constexpr函数进行求值并将结果直接嵌入到使用该函数的地方而不是在每个源文件中生成独立的函数定义。
因此使用constexpr int作为函数的返回类型可以避免重定义错误因为编译器会在编译时对函数进行求值并将结果直接嵌入到源文件中而不会生成多个独立的函数定义。
需要注意的是使用constexpr修饰函数的返回类型只有在函数体内部是一个可以在编译时求值的表达式时才有效。如果函数的定义依赖于运行时的变量或其他不可在编译时确定的值那么将函数的返回类型声明为constexpr是不合法的。
2、
对于类的静态成员变量如果你想在头文件中定义并初始化它然后在多个源文件中包含该头文件就会导致重定义错误。
为了解决这个问题你可以将静态成员变量的定义放在头文件中但将其声明放在头文件中并在一个源文件中进行定义和初始化。然后在其他源文件中只需包含该头文件即可。或者加inline加constexpr无用
3、
templatetypename T
class bb {
public:static const int bf;
};templatetypename T
constexpr int bbT::bf 2;
对于模板类的静态成员变量使用constexpr关键字进行定义和初始化时如果在头文件中定义并初始化会导致重定义错误。
这是因为constexpr关键字要求在编译时就能够确定其值而模板类的静态成员变量的值是在模板实例化时确定的。因此无法在头文件中使用constexpr关键字对模板类的静态成员变量进行定义和初始化。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91913.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!