C++ 常量引用函数参数的地址何时唯一?

C++ 常量引用函数参数的地址何时唯一?,c++,cross-platform,stack-memory,addressof,pass-by-const-reference,C++,Cross Platform,Stack Memory,Addressof,Pass By Const Reference,在下面的示例代码中,我想知道对log\u cref\u address的两个调用何时能够可靠地打印相同的地址 #include <iostream> #include <thread> #include <functional> using namespace std; void log_cref_address(const int& t) { cout << addressof(t) << ' '; } temp

在下面的示例代码中,我想知道对
log\u cref\u address
的两个调用何时能够可靠地打印相同的地址

#include <iostream>
#include <thread>
#include <functional>

using namespace std;

void log_cref_address(const int& t) {
    cout << addressof(t) << ' ';
}

template <int i>
void foo() {
    log_cref_address(i); // different if foo called from different threads
    thread([] { log_cref_address(i); }).join(); // same if already in thread
    thread(log_cref_address, i).join(); // same if already in thread
    cout << endl;
}

int main() {
    // first three calls print identical addresses
    cout << "foo<0>: "; foo<0>(); 
    cout << "foo<0>: "; foo<0>();
    cout << "foo<1>: "; foo<1>();
    cout << endl;
    // last two from thread yields different addresses from the first three
    cout << "lambda: "; thread([] { foo<0>(); }).join();
    cout << "bind(): "; thread(bind(foo<0>)).join();
    return 0;
}
从许多这样的输出中,我观察到
main
的行为如下:

  • foo
    的前三次调用打印相同的地址
  • 最后两次调用
    foo
    (来自线程)打印前三次调用未打印的地址
  • 在对
    foo
    的最后两次调用中,
    log\u cref\u address
    仅当从子线程调用时才打印相同的地址

  • (这些行为)是否由C++标准保证,在任何机器上?

    它们都没有。该标准不保证临时变量的地址。

    它们都没有。标准不保证临时变量的地址。

    特别是它不保证延长临时变量的生存期。特别是它不保证延长临时变量的生存期。
    foo<0>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28 
    foo<0>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28 
    foo<1>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28 
    
    lambda: 0x7fa0585b5dcc 0x7fa057db4e1c 0x7fa0500008c8 
    bind(): 0x7fa0585b5d1c 0x7fa057db4e1c 0x7fa0500008c8