7

constexpr int *np = nullptr和 和有什么不一样int const *np = nullptr

np在这两种情况下,它都是指向为 null 的 int 的常量指针。constexpr在指针的上下文中是否有任何特定用途。

4

1 回答 1

3

如果您尝试对指针执行任何操作并在常量表达式中使用结果,则必须将指针标记为 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;

在上面的例子中,second只能是constexprif firstis。同样*second只能是常量表达式 if secondisconstexpr

如果尝试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

于 2015-08-18T06:18:48.800 回答