在C ++ Primer 5th中,它说
constexpr 对它定义的对象施加顶级const。
那么我如何声明一个带有 constexpr 说明符的指针强加一个低级const,即一个指向 constexpr 对象的指针?
答案 0 :(得分:1)
constexpr对象就像任何其他对象一样。它的值在编译时计算的事实并没有改变这一点。
通常,编译器会设法避免实际发出代码来创建const值和对象(如果它知道永远不需要它们),例如当对象为static const
时。
通过获取对象的地址,无论constexpr
,static 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