Closed PeteHenry closed 9 years ago
不等价
@PeteHenry :
从问题描述看,你对相关知识的理解还不够深入,有可能代码量也不够。不建议深究constexpr
的含义和用处,相当一段时间内(1-10年)你都用不太上constexpr
的。建议重点理解const
。书上碰到constexpr
的时候跳过去即可。
同意 @Mooophy 关于学习指导上的建议。
constexpr
是 c++11 中一个比较偏的话题。
从大类上讲,可分为:
所以,理论上讲,可以留到 Functions 那里再加强了解。
就你的例子而言,显然是不等价的。因为 constexpr
与 const
明显是不同的概念。
constexpr
与 const
的作用域不同,前者处于编译期,后者处于运行期。对于变量来讲,用 constexpr
修饰, 那就是在编译期间就将该变量置为字面量(LiteralType)了。
但标记为字面量,隐含着另一层含义:该变量同时也是 top-level const
的。
那么:
constexpr const int ci = 10;
constexpr int ci = 10;
完全等价。
constexpr int *pi = nullptr;
constexpr int * const pi = nullptr;
完全等价。pi 都是 top-level const
pointer to int
.
constexpr const int * const pi = nullptr;
constexpr const int * pi = nullptr;
完全等价。pi 都是 top-level const
pointer to const int
.
但你举的两个例子,却不等价,因为没有同时在 constexpr
的修饰下进行比较,大概念上就有差别。
一点有意思的证明:
const char* const str1 = "foo"; // 编译器很安静
constexpr char *const str2 = "foo"; // 编译器会有警告
警告内容如下:
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
constexpr char *const str2 = "foo";
^
参考资料:
@PeteHenry 也可以看看这个 constexpr和const数组的区别
@Mooophy @pezy @Ocxs ,谢谢解答 目前只能理解{constexpr 与 const 的作用域不同,前者处于编译期,后者处于运行期。}这句话。 因为正好看到数组,数组的长度和维数必须在编译期已知,constexper 的确有效 因为处于 c++ 新手期,所以现在看的大都是基础语言方面的知识,也向前辈问了些枯燥的东东,谢谢了
@PeteHenry C++很多东西的学习价值很低,而CP这种大而全的书吧,又过于面面俱到。如果初学者把精力均匀分布到每个知识点上的话,会浪费很多精力。
constexpr
就是一个例子,这货主要用在 template metaprogramming 上,要旨是以损失编译时间为代价,提高运行效率。玩这种范式的人都是大师级高手。而且拉长编译时间这种诡异的思路在其他主流语言上很少见,越动态的语言、越少见。
总之,目前constexpr
这类东西完全可以跳过,日后代码量上来了,如果还有兴趣的话,再研究不迟。按你目前的学习进度,重点放在const
、引用上面,这些是基础。
恩,谢谢 我也觉得这书精细,忽悠的我都不知重点(常用的)在哪,刚跳过了一部分,直接看了 string 、 vector 与数组 3Q
在 2015年4月21日 上午11:36,Yue Wang notifications@github.com写道:
@PeteHenry https://github.com/PeteHenry C++很多东西的学习价值很低,而CP这种大而全的书吧,又过于面面俱到。如果初学者把精力均匀分布到每个知识点上的话,会浪费很多精力。
constexpr就是一个例子,这货主要用在 template metaprogramming 上,要旨是以损失编译时间为代价,提高运行效率。玩这种范式的人都是大师级高手。而且拉长编译时间这种诡异的思路在其他主流语言上很少见,越动态的语言、越少见。
总之,目前constexpr这类东西完全可以跳过,日后代码量上来了,如果还有兴趣的话,再研究不迟。按你目前的学习进度,重点放在const 、引用上面,这些是基础。
— Reply to this email directly or view it on GitHub https://github.com/ReadingLab/Discussion-for-Cpp/issues/4#issuecomment-94628615 .
Q: 两者等价?