指针中的 constexpr 有区别吗
Does constexpr in pointers make a difference
constexpr int *np = nullptr
和int const *np = nullptr
有什么区别?
在这两种情况下,np
都是一个指向 null 的常量指针。 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;
在上面的例子中,如果 first
是,second
只能是 constexpr
。同样,如果 second
是 constexpr
,则 *second
只能是常量表达式
如果您尝试通过指针调用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
constexpr int *np = nullptr
和int const *np = nullptr
有什么区别?
np
都是一个指向 null 的常量指针。 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;
在上面的例子中,如果 first
是,second
只能是 constexpr
。同样,如果 second
是 constexpr
*second
只能是常量表达式
如果您尝试通过指针调用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