Здравствуйте, MikelSV, Вы писали:
MSV>Вы не поверите:
MSV>bool RunFunc(..., Val &retd=(Val&)Val());
MSV>ошибка: invalid cast of an rvalue expression of type ‘MCCVal’ to type ‘MCCVal&’
Отчего же, поверю. Это элементарно.
bool RunFunc(..., Val const & retd = Val());
Такие вещи подразумевают константность временных данных. Это очень редкий случай, когда действительно нужно менять что-то в таких объектах. В первую очередь, если возникает такой гвоздь — причина пересмотреть дизайн программы.
MSV>И я пишу в retd. и не интересно, будет ли оно использоваться или разрушится.
Как исправить — написано выше. Если вам нужно нарушить закон, вы должны будете отвечать за последствия. Нарушать закон можно так:
bool RunFunc(..., Val const & retd = Val())
{
Val & retd_ = const_cast<Val &>(retd);
}
MSV>Для чего это было сделано история умалчивает
(
8.5.3/5)
MSV>но за такие дела я смотрю на компилятор как на врага. 
Смотрите лучше так на того, кто это писал.
MSV>Стандарты как минимум ограничивают фантазию.
Стандарты обеспечивают порядок. И не вина GCC, что MSVC выбрал путь анархии.