Здравствуйте, rg45, Вы писали:
R>Возможен сценарий получения битой ссылки. При нынешних-то тенденциях максимально широкого использования auto&&:
R>R>auto&& v = push_back_helper( std::vector<int>(), i );
R>
Собрал я такой код (вернее, скомпилировал в текстовый llvm с O3)
template<typename T>
T& test( T&&t)
{
return t;
}
struct IntWrapper {
IntWrapper(int x): x(x) {}
~IntWrapper() { x = 1; }
int getX() { return x; }
int x;
};
int main()
{
auto&& i = test(IntWrapper(0));
return i.getX();
}
Превращается в возврат 1
(((
По коду ссылка не битая, но она указывает на мёртвый объект, у которого уже вызван деструктор
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте