Ответ 1
Вы не можете взять неконстантную ссылку на временную, например, как foo2.
Обратите внимание, что это не специальные параметры по умолчанию. Вы получаете ту же ошибку для функциональных переменных: http://ideone.com/g7Tf7L
#include <string>
using std::string;
#include <iostream>
using std::cout; using std::endl;
int main()
{
string s1 = string("s1"); // OK, copy it
const string& s2 = string("s2"); // OK, const reference to it
string& s3 = string("s3"); // ERROR! non-const reference not allowed!
cout
<< s1 << ", "
<< s2 << ", "
<< s3 << endl;
return 0;
}
Когда вы ссылаетесь на ссылку const на временную, время жизни временного объекта распространяется на время жизни ссылки (§12.2, цитируемое из моей копии проекта С++ 11 n3337):
Есть два контекста, в которых временные объекты уничтожаются в другой точке, чем конец fullexpression.
...
Второй контекст - это когда привязка привязана к временному. Временное, к которому привязана ссылка, или временное, являющееся полным объектом подобъекта, к которому привязана ссылка, сохраняется для времени жизни ссылки, за исключением:
- Временная привязка к ссылочному элементу в конструкторе ctor-initializer (12.6.2) сохраняется до завершения конструктора.
- Временная привязка к эталонному параметру в вызове функции (5.2.2) сохраняется до завершения полного выражения, содержащего вызов.
- Время жизни временной привязки к возвращаемому значению в операторе return функции (6.6.3) не продлевается; временное уничтожается в конце полного выражения в операторе return.
- Временная привязка к ссылке в new-initializer (5.3.4) сохраняется до завершения полного выражения, содержащего новый-инициализатор.