Что такое «Это не работает для ссылок, которые являются членами объектов» значит в GotW # 88?

Херб Саттер:

Эффективный параллелизм: используйте иерархии блокировок, чтобы избежать тупиковых эффектов
Параллелизм: нарушай закон Амдала! »ПОЛУЧИЛСЯ № 88: Кандидат в« Мост »
Важный конст »2008-01-01 от Херба Саттера Мой друг недавно спросил меня
законен ли приведенный ниже пример 1, и если да, то что это значит. Это привело к
хорошая дискуссия, я думал, что я буду публиковать здесь. Так как это было близко к GotW
стиль уже, я думал, что сделаю еще один почетный после всех этих
лет … нет, я не принял новогоднюю резолюцию, чтобы возобновить запись
обычные GotWs. 🙂

JG Вопросы Q1: Является ли следующий код допустимым C ++?

// Example 1

string f() { return "abc"; }

void g() {
const string& s = f();
cout << s << endl;    // can we still use the "temporary" object?
}

A1: да. Это особенность C ++ … код действителен и делает точно
что он делает.

Обычно временный объект длится только до конца полного
выражение, в котором оно появляется. Тем не менее, C ++ намеренно указывает
это связывание временного объекта со ссылкой на const в стеке
удлиняет время жизни временного до времени жизни
ссылаться на себя, и, таким образом, избегает того, что в противном случае было бы общим
ошибка свисающей ссылки. В приведенном выше примере временное возвращение
по f () доживает до закрывающей фигурной скобки. (Обратите внимание, это относится только к
стековые ссылки. Это не работает для ссылок, которые
члены объектов
.)

Первоначально я думаю, что последнее предложение означает:

class A
{
public:
int x;
A(const int& x_)
{
x = x_;
}
};

int main()
{
A a(1); // assign lvalue to const int&
std::cout << a.x;
}

Тем не менее, он работает нормально, по-видимому.

Итак, что означает «Это не работает для ссылок, которые являются членами объектов»?

1

Решение

Это означает, что если вы делаете что-то вроде этого:

string f() { return "abc"; }

struct foo {
string const & _s;
foo() : _s(f()) {}
};

Это не продлит жизнь временному возвращенному из f, И ссылка _s будет болтаться

Продление срока службы временных файлов является свойством ссылок с автоматическим сроком хранения. То есть локальные переменные в области действия функции.

5

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

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

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