2016-12-09 12 views
2
struct A 
{ 
    // clang 3.8 error : cannot combine with previous 'static' declaration specifier 
    static mutable int n; 
}; 

Я думаю, что static mutable int n; имеет четкую семантику в некоторых случаях. Почему это запрещено в C++?Почему «static mutable int n;» не разрешено в C++?

Обновление:

Другой пример, чтобы показать clear semantics:

class SharedValue 
{ 
public: 
    void Set(int n) 
    { 
     std::lock_guard lock(_mtx); 
     _n = n; 
    } 


    int Get() const 
    { 
     std::lock_guard lock(_mtx); 
     // 
     // _mtx should be mutable, 
     // because this is in const member function 
     // 

     return _n; 
    } 

private: 
    static mutable std::mutex _mtx; 
    int _n; 
}; 
+2

_ «В некоторых случаях есть четкая семантика». Не могли бы вы рассказать об этом? Я не понимаю, что вы имеете в виду. 'static' не имеет ничего общего с' const' или 'mutable'. –

ответ

7

Вы сказали:

// _mtx must be mutable, because this is in const member function 

Это недоразумение. A static переменная-член может быть изменена в функции-члене const, поскольку первая не связана с конкретным экземпляром класса. Следовательно, понятие mutable для переменной-члена static не имеет большого смысла.

4

Переменная член static класс не связан с экземпляром класса.
So mutable, который изменил бы поведение при доступе и изменении значений от const класс пример не имеет смысла.


Как для примера, что вы предоставили с обновлением:

// _mtx should be mutable, 
// because this is in const member function 

std::mutex _mtx; не должно быть static членом. Вам не нужно блокировать все экземплярыSharedValue, но только текущий (и даже если нет, вам не нужно предоставлять mutable_mtx для члена static, который может быть изменен, он уже есть).

Просто опустите ключевое слово static, используя mutable мьютексы - обычная техника.

0

Нет четкой возможной семантики, поскольку стандарт не поддерживает эту комбинацию ключевых слов.

В исходных словах C, как правило, имелось мнемоническое значение.

В настоящее время ключевые слова C++ были повторно использованы, так что они имеют множество значений, например. несколько значений static (что является одним из ваших ключевых слов).


Обратите внимание, что const -ness из не- static функции члена составляет около const -ness из *this, и не имеет ничего общего с const -ness члена в static данных.

Если бы мы должны были определить некоторые не совсем неестественный значение для mutable применительно к члену в static данных, она должна была бы быть в связи с const для static функций-членов. Это еще одно возможное расширение языка.

Вы можете ввести ограничения на изменчивость, указав отдельный класс для хранения состояния static.

+0

downvoter, проявите себя. Спасибо. –

+0

Ну, я не собираюсь добавлять более полезную информацию к этому ответу, когда все, что получает, является анонимным идиотом. Нынешние два других ответа немного отсутствуют. Но OP и читатели никогда не узнают, если кто-то еще не захочет присоединиться. –

 Смежные вопросы

  • Нет связанных вопросов^_^