指针中的constexpr是否有所作为?

constexpr int *np = nullptrint 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;

在上面的例子中,如果firstsecond ,那么只能是constexpr 。 同样*second只能是一个常量表达式如果secondconstexpr

如果您尝试通过指针调用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

链接地址: http://www.djcxy.com/p/28409.html

上一篇: Does constexpr in pointers make a difference

下一篇: Using Microsoft debugger with Xamarin Android