Когда адрес параметра справочной функции const уникален?

В моем примере кода ниже, я хотел бы знать, когда два вызова log_cref_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<0>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28
foo<0>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28
foo<1>: 0x7fff7cf5507c 0x7fa0585b5e1c 0x196fc28

lambda: 0x7fa0585b5dcc 0x7fa057db4e1c 0x7fa0500008c8
bind(): 0x7fa0585b5d1c 0x7fa057db4e1c 0x7fa0500008c8

Из многих подобных выводов я заметил, что main ведет себя следующим образом:

  1. Первые три звонка foo печатать одинаковые адреса.
  2. Последние два звонка foo (из цепочек) печатать адреса, не напечатанные при первых трех вызовах.
  3. В последних двух звонках foo, log_cref_address печатает тот же адрес, если и только если вызван из подпотока.

Какие (если таковые имеются) эти поведения гарантируются стандартом C ++ на любой машине?

0

Решение

Никто из них. Стандарт не гарантирует адрес временной переменной.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]