指针类型是文字类型吗?

时间:2018-05-22 11:20:35

标签: c++

标量类型定义为

  

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出错。这是否意味着指向全局的指针很好但是自动变量不是?标准在任何地方都提到这个吗?

2 个答案:

答案 0 :(得分:12)

指针是文字类型。在某些条件下,它们可以是change Thu May 10 2018 06:59:26 GMT-0400 (Eastern Daylight Time)

  

[expr.const] 6

     

... [指针为constexpr if]它包含具有静态存储持续时间的对象的地址,超过此类对象末尾的地址(5.7),函数的地址或空指针值。

(其中“具有静态存储持续时间的对象”表示全局或静态对象,或此类对象的子对象。)

A demo:

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