如何定义指向constexpr变量的指针?

时间:2016-06-13 11:46:51

标签: c++ pointers constexpr

在C ++ Primer 5th中,它说

  

constexpr 对它定义的对象施加顶级const。

那么我如何声明一个带有 constexpr 说明符的指针强加一个低级const,即一个指向 constexpr 对象的指针?

1 个答案:

答案 0 :(得分:1)

constexpr对象就像任何其他对象一样。它的值在编译时计算的事实并没有改变这一点。

通常,编译器会设法避免实际发出代码来创建const值和对象(如果它知道永远不需要它们),例如当对象为static const时。

通过获取对象的地址,无论constexprstatic const还是自动变量,编译器都被迫实际创建对象。

所以:

constexpr int i = 5;    // need not be actually created

const int* pi = &i;     // but now it must be, because we took its address

constexpr const int* pi2 = &i;  // constexpr pointer to const object - we took its address so it must exist


const void emit(int);

int main()
{
  emit(i);
  emit(*pi);
  emit(*pi2);
}

结果:

main:
        subq    $8, %rsp
        movl    $5, %edi         <-- compiler knows it's a fixed value
        call    emit(int)

        movq    pi(%rip), %rax   <-- compiler dereferences the pointer
        movl    (%rax), %edi
        call    emit(int)

        movl    $5, %edi      <-- compiler knows it's a fixed value
        call    emit(int)

        xorl    %eax, %eax
        addq    $8, %rsp
        ret
pi:
        .quad   i
i:
        .long   5