З цієї статті блогу Visual C ++ про посилання на оцінку :
... C ++ не хоче, щоб ви випадково змінювали часові файли, але безпосередньо виклик функції, яка не містить const, на змінному rvalue є явним, тому це дозволено ...
По суті, вам не слід намагатися модифікувати тимчасові причини з тієї причини, що вони є тимчасовими об'єктами і вмирають будь-який момент. Причина, яку вам дозволяють викликати неконстативні методи, полягає в тому, що, ну, ви можете робити якісь "дурні" речі, доки ви знаєте, що ви робите, і ви явно про це (наприклад, використовуючи reinterpret_cast). Але якщо ви прив’язуєте тимчасове до неконст-посилання, ви можете продовжувати передавати його навколо "назавжди" лише для того, щоб ваше маніпулювання об'єктом зникло, бо десь по дорозі ви повністю забули, що це було тимчасовим.
Якби я був ти, я б переосмислив дизайн своїх функцій. Чому g () приймає посилання, він змінює параметр? Якщо ні, зробіть це const посиланням, якщо так, то чому ви намагаєтесь передати його тимчасово, чи вам не байдуже, це тимчасовий ви модифікуєте? Чому getx () повертається тимчасово? Якщо ви поділитеся з нами своїм реальним сценарієм і тим, що ви намагаєтеся здійснити, ви можете отримати кілька хороших пропозицій, як це зробити.
Іти проти мови та обдурити компілятор рідко вирішує проблеми - зазвичай це створює проблеми.
Редагувати: Адресуючи питання в коментарі: 1)
X& x = getx().ref(); // OK when will x die?
- Я не знаю і мені все одно, адже це саме те, що я маю на увазі під «протилежністю до мови». У мові сказано, що "тимчасові люди вмирають в кінці висловлювання, якщо тільки вони не зобов'язані конституційним посиланням; в цьому випадку вони гинуть, коли посилання виходить за межі". Застосовуючи це правило, здається, що x вже мертвий на початку наступного висловлювання, оскільки він не пов'язаний з const посиланням (компілятор не знає, що ref () повертає). Це лише здогадка.
2) Я чітко заявив про мету: вам не дозволяється змінювати часові теми, оскільки це просто не має сенсу (ігнорування посилань на C ++ 0x rvalue). Питання "тоді чому мені дозволяється дзвонити членам, які не беруть участь у конкурсі" це добре, але я не маю кращої відповіді, ніж той, про який я вже говорив вище.
3) Ну, якщо я маю рацію про те, що X& x = getx().ref();
помер у кінці висловлювання, проблеми очевидні.
У будь-якому випадку, виходячи з вашого запитання та коментарів, я не думаю, що навіть ці додаткові відповіді вас не задовольнять. Ось остаточна спроба / резюме: Комітет C ++ вирішив, що не має сенсу змінювати часові сховища, тому вони забороняють прив'язувати до посилань, які не мають права. Можливо, якась реалізація компілятора чи історичні проблеми також були пов'язані, я не знаю. Потім з'явився якийсь конкретний випадок, і було вирішено, що проти всіх шансів вони все ж дозволять пряму модифікацію за допомогою виклику методу non-const. Але це виняток - вам, як правило, не дозволяється змінювати часописи. Так, C ++ часто буває дивним.