Эффективный параллелизм: используйте иерархии блокировок, чтобы избежать тупиковых эффектов
Параллелизм: нарушай закон Амдала! »ПОЛУЧИЛСЯ № 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;
}
Тем не менее, он работает нормально, по-видимому.
Итак, что означает «Это не работает для ссылок, которые являются членами объектов»?
Это означает, что если вы делаете что-то вроде этого:
string f() { return "abc"; }
struct foo {
string const & _s;
foo() : _s(f()) {}
};
Это не продлит жизнь временному возвращенному из f
, И ссылка _s
будет болтаться
Продление срока службы временных файлов является свойством ссылок с автоматическим сроком хранения. То есть локальные переменные в области действия функции.
Других решений пока нет …