标量类型定义为
Trait类,用于标识T是否为标量类型。标量类型 是一种为加法运算符具有内置功能的类型 没有重载(算术,指针,成员指针,枚举和 的std :: nullptr_t)。
它从integral_constant继承为true_type或 false_type,取决于T是否是标量类型,无论它是什么 常数和/或挥发性资格。
这意味着指针是标量类型。
现在,如果我们去定义文字类型:
类型是文字类型,如果它是:
- 标量类型;或
- 参考类型;或
- 一个文字类型的数组;要么 -a类型(第9节)具有以下所有属性:
- 它有一个简单的析构函数,
- 非静态数据成员(如果有)的brace-or-equal-initializers中的每个构造函数调用和完全表达式都是常量表达式(5.19),
- 它是一个聚合类型(8.5.1)或者至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
- 它的所有非静态数据成员和基类都是文字类型。
现在,结合上面两个语句,它意味着指针是文字类型。但是指针不能是constexpr。请有人澄清一下吗?
进一步查看以下代码:
int a = 7;
constexpr int *pointer1 = &a;
int main ()
{
int b = 4;
constexpr int *pointer2 = &b;
}
指针1很好,但指针2出错。这是否意味着指向全局的指针很好但是自动变量不是?标准在任何地方都提到这个吗?
答案 0 :(得分:12)
指针是文字类型。在某些条件下,它们可以是change Thu May 10 2018 06:59:26 GMT-0400 (Eastern Daylight Time)
:
[expr.const] 6
... [指针为
constexpr
if]它包含具有静态存储持续时间的对象的地址,超过此类对象末尾的地址(5.7),函数的地址或空指针值。
(其中“具有静态存储持续时间的对象”表示全局或静态对象,或此类对象的子对象。)
constexpr
显然GCC(int x;
int main()
{
constexpr int *ptr = &x; // Compiles.
// Doesn't compile: `error: '& foo' is not a constant expression`
// int foo;
// constexpr int *bar = &foo;
}
/ -pedantic-errors -std=c++11
/ 14
)高兴地接受超出范围的constexpr指针算法:17
,这对我来说似乎是个错误。
答案 1 :(得分:3)
是的,他们是文字;是的,他们可以是constexpr。为了证明:
org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver