const vs constexpr关于变量

以下定义之间有区别吗?


const     double PI = 3.141592653589793;

constexpr double PI = 3.141592653589793;

如果没有,在C ++ 11中首选哪种风格?


侃侃尔雅
浏览 799回答 3
3回答

慕尼黑8549860

我相信存在差异。让我们重命名它们,以便我们可以更容易地讨论它们:const     double PI1 = 3.141592653589793;constexpr double PI2 = 3.141592653589793;这两个PI1和PI2是不变的,这意味着你不能修改它们。但是只有 PI2编译时常量。它应在编译时初始化。  PI1可以在编译时或运行时初始化。此外,只能 PI2在需要编译时常量的上下文中使用。例如:constexpr double PI3 = PI1;  // error但:constexpr double PI3 = PI2;  // ok和:static_assert(PI1 == 3.141592653589793, "");  // error但:static_assert(PI2 == 3.141592653589793, "");  // ok至于你应该使用哪个?使用符合您需求的任何一种。您是否希望确保您具有可在需要编译时常量的上下文中使用的编译时常量?您是否希望能够在运行时进行计算来初始化它?等等。

jeck猫

这里没有区别,但是当你有一个具有构造函数的类型时,这很重要。struct S {    constexpr S(int);};const S s0(0);constexpr S s1(1);s0是一个常量,但它不承诺在编译时初始化。s1是标记的constexpr,所以它是一个常量,因为它S的构造函数也被标记constexpr,它将在编译时初始化。大多数情况下,这很重要,因为在运行时初始化会非常耗时,并且您希望将该工作推送到编译器上,这也很耗时,但不会减慢编译程序的执行时间

人到中年有点甜

constexpr表示编译期间常量且已知的值。const表示一个仅为常数的值; 在编译期间不必知道。int sz;constexpr auto arraySize1 = sz;&nbsp; &nbsp; // error! sz's value unknown at compilationstd::array<int, sz> data1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// error! same problemconstexpr auto arraySize2 = 10;&nbsp; &nbsp; // fine, 10 is a compile-time constantstd::array<int, arraySize2> data2; // fine, arraySize2 is constexpr请注意,const不提供与constexpr相同的保证,因为const对象无需使用编译期间已知的值进行初始化。int sz;const auto arraySize = sz;&nbsp; &nbsp; &nbsp; &nbsp;// fine, arraySize is const copy of szstd::array<int, arraySize> data; // error! arraySize's value unknown at compilation所有constexpr对象都是const,但并非所有const对象都是constexpr。如果您希望编译器保证变量的值可以在需要编译时常量的上下文中使用,那么要实现的工具是constexpr,而不是const。
打开App,查看更多内容
随时随地看视频慕课网APP