对于许多问题,答案似乎可以在"标准"中找到.但是,我们在哪里找到它?最好是在线.
谷歌搜索有时会觉得徒劳,尤其是对于C标准,因为他们在编程论坛的大量讨论中被淹没.
要开始这个,因为这些是我现在正在搜索的,那里有很好的在线资源:
为了阻止我最近给出的答案评论中的论点,我想对以下问题作一些建设性的答案:
Ben Voigt和简化示例代码(在ideone.com上运行):
#include <iostream>
#include <new>
struct something
{
int i;
};
int main(void)
{
char buffer[sizeof (something) + 40];
something* p = new (buffer) something;
p->i = 11;
int& outlives = p->i;
std::cout << outlives << "\n";
p->~something(); // p->i dies with its parent object
new (p) char[40]; // memory is reused, lifetime of *p (and p->i) is so done
new (&outlives) int(13);
std::cout << outlives << …Run Code Online (Sandbox Code Playgroud) 在 C++ 中,普通值可以使用 转换为指向其自身的指针&value,或通过隐式转换转换为对其自身的引用。
与 Rust 不同,引用并不是实际的一等类型,而只是某些类型声明站点接受的二进制限定符。引用可以透明地使用,就好像它们是它们的裁判一样,隐藏内部指针1。因此,我们可以&refToValue立即获取指向裁判的指针。
如果我将指针转换为引用,再转换回指针,我能保证恢复到原始指针吗?Rust 中就是这种情况,但 Rust 再次将一级引用定义为通过指针抽象的“普通”类型。
// Sample code by @chi
T x;
T* ptr1 = &x;
T& ref = *ptr1;
T* ptr2 = &ref;
assert(ptr1 == ptr2); // Is that always true according to the spec?
Run Code Online (Sandbox Code Playgroud)
1:我知道 C++ 标准不要求将引用实现为指针,但我看不出如何以任何其他方式实现它们(不考虑上下文特定的优化),特别是如果我的最后一个问题的答案是“是的”。