c – 指针中的constexpr是否有所作为

constexpr int * np = nullptr和int const * np = nullptr有什么区别?

在两种情况下,np都是一个指向int的常量指针.在指针的上下文中是否有任何constexpr的特定用法.

解决方法

如果您尝试对指针执行任何操作并在常量表达式中使用结果,则必须将指针标记为constexpr.简单的例子是指针算术或指针解除引用:
static constexpr int arr[] = {1,2,3,4,5,6};
constexpr const int *first = arr;
constexpr const int *second = first + 1; // would fail if first wasn't constexpr
constexpr int i = *second;

在上面的例子中,第二个只能是constexpr,如果是第一个.类似地,如果第二个是constexpr,则第二个只能是一个常量表达式

如果尝试通过指针调用constexpr成员函数并将结果用作常量表达式,则调用它的指针本身必须是常量表达式

struct S {
    constexpr int f() const { return 1; }  
};

int main() {
    static constexpr S s{};
    const S *sp = &s;
    constexpr int i = sp->f(); // error: sp not a constant expression
}

如果我们改为说

constexpr const S *sp = &s;

那么上面的工作是有效的.请注意,上述(错误地)编译并使用gcc-4.9运行,但不是gcc-5.1

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...