Читая о категориях значений в C ++ 11 и далее на cppreference , мне трудно понять мотивацию для того, чтобы функции-члены были prvalues.
a.m
,член выражения объекта, где m
является ... нестатической функцией-членом
За исключением того, что они не являются истинными значениями, потому что их единственное свойство заключается в том, что они могут быть вызваны.
Выражения a.mf
... [и друзья] ... классифицируются как выражения prvalue, но их вообще нельзя использовать ... для каких-либо целей, кроме как в качестве левого аргументаоператор вызова функции
Кроме того, как временная материализация C ++ 17 взаимодействует с категорией значений функций-членов?Начиная с cppreference ,
Временная материализация происходит ... при выполнении доступа члена к классу prvalue
Для меня это имеет больше смысла в целомчто функции являются неизменяемыми l-значениями.То есть у них есть определенное местоположение.Я понимаю, что в случае виртуальной функции-члена нет местоположения времени компиляции, поэтому я понимаю, почему этот случай не будет lvalue.Я также вижу, что функция-член временно материализованного класса также может не иметь местоположения времени компиляции и не может быть lvalue, хотя функция-член все еще где-то компилируется и имеет местоположение (C ++ может просто сделать невозможным обращение к этому местоположению вуровень языка).
Что меня больше всего смущает, так это то, что компилятор в конечном итоге не будет относиться к не виртуальной функции-члену иначе, чем к любой другой функции.Единственная разница - искажение имени.Так почему же в мире они относятся к разным категориям значений?
Должна быть веская причина, по которой функции-члены не являются lvalues, если они имеют четко определенное местоположение.Это настоящая мутная вода.Может ли кто-нибудь дать мотивацию и разъяснение?