ReadingLab / Discussion-for-Cpp

C++ 中文讨论区
MIT License
88 stars 63 forks source link

constexpr int *pi = nullptr; 与 int *const pi = nullptr; 是一样的么? #4

Closed PeteHenry closed 9 years ago

PeteHenry commented 9 years ago
const int *pi = nullptr;    // pi 是一个指向整型常量的指针
int *const pi = nullptr;    // pi 是一个指向整数的常量指针
constexpr int *pi = nullptr;    // pi 是一个指向整数的常量指针

Q: 两者等价?

Mooophy commented 9 years ago

不等价 @PeteHenry : 从问题描述看,你对相关知识的理解还不够深入,有可能代码量也不够。不建议深究constexpr的含义和用处,相当一段时间内(1-10年)你都用不太上constexpr的。建议重点理解const。书上碰到constexpr的时候跳过去即可。

pezy commented 9 years ago

同意 @Mooophy 关于学习指导上的建议。

constexpr 是 c++11 中一个比较偏的话题。

从大类上讲,可分为:

所以,理论上讲,可以留到 Functions 那里再加强了解。


就你的例子而言,显然是不等价的。因为 constexprconst 明显是不同的概念。

constexprconst 的作用域不同,前者处于编译期,后者处于运行期。对于变量来讲,用 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";
                                  ^

参考资料:

Ocxs commented 9 years ago

@PeteHenry 也可以看看这个 constexpr和const数组的区别

PeteHenry commented 9 years ago

@Mooophy @pezy @Ocxs ,谢谢解答 目前只能理解{constexpr 与 const 的作用域不同,前者处于编译期,后者处于运行期。}这句话。 因为正好看到数组,数组的长度和维数必须在编译期已知,constexper 的确有效 因为处于 c++ 新手期,所以现在看的大都是基础语言方面的知识,也向前辈问了些枯燥的东东,谢谢了

Mooophy commented 9 years ago

@PeteHenry C++很多东西的学习价值很低,而CP这种大而全的书吧,又过于面面俱到。如果初学者把精力均匀分布到每个知识点上的话,会浪费很多精力。

constexpr就是一个例子,这货主要用在 template metaprogramming 上,要旨是以损失编译时间为代价,提高运行效率。玩这种范式的人都是大师级高手。而且拉长编译时间这种诡异的思路在其他主流语言上很少见,越动态的语言、越少见。

总之,目前constexpr这类东西完全可以跳过,日后代码量上来了,如果还有兴趣的话,再研究不迟。按你目前的学习进度,重点放在const、引用上面,这些是基础。

PeteHenry commented 9 years ago

恩,谢谢 我也觉得这书精细,忽悠的我都不知重点(常用的)在哪,刚跳过了一部分,直接看了 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 .