Стандарт обеспечивает следующее примечание:Мутация изменяемых данных-член через указатель на член
[Примечание: это не представляется возможным использовать указатель на элемент, который ссылается на изменяемый член изменить объект класса const. Например,
struct S { S() : i(0) { } mutable int i; }; void f() { const S cs; int S::* pm = &S::i; // pm refers to mutable member S::i cs.*pm = 88; // ill-formed: cs is a const object }
-end примечание]
Но мы можем использовать только объектно-выражение для изменения константного объекта, имеющий элемент mutale данных.
#include <iostream>
struct A
{
A(){ }
mutable int a;
};
const A a;
int main()
{
a.a = 4;
std::cout << a.a; //4
}
Но ISO/IEC Derictive говорит
Примечания и примеры интегрированных в тексте документа должны быть использоваться только для предоставления дополнительной информации, предназначенной для оказания помощи понимания или использования документа. Они не должны содержать требования («должны», см 3.3.1 и таблицу Н.1) или любую информацию считается необходимым для использования документа [...]
Что означает примечание я обеспечиваю в начале моего Q не является требованием.
Я ищу нормативное требование, исключающее такое использование.
Не ясно. Вы правы в объединении спецификаторов const в cs. * Pm is const. Но если E2 объявлен как изменяемый член, то тип E1.E2 является «vq12 T» _. Это означает, что cs. * Pm не является константным. – 2014-09-28 09:26:52
E2 в этом случае не является изменяемым членом, это * указатель * для члена, который может быть или не быть «изменчивым», эта информация уже потеряна. – user657267
Стандарт в конце 5.5/2: _ Результатом является объект или функция типа, указанного вторым операндом_, что в нашем случае это просто 'int'. Это то, что вы имеете в виду? – 2014-09-28 09:44:48