2012-05-24 4 views
1

Является ли позиционирование ключевого слова «volatile» в объявлении метода влияющим на его функциональность?Позиция ключевого слова volatile в объявлении функции члена в C++

i.e, есть ли разница между следующими двумя частями кода?

А.

class Test 
{ 
public: 
    volatile void testMe() 
    { 
    } 
}; 

B.

class Test 
{ 
public: 
    void testMe() volatile 
    { 
    } 
}; 

И То же самое, когда функция-член имеет возвращаемое значение. Спасибо!

ответ

5

Это то же самое, что и для квалификатора const.

В первом примере volatile применяется к возвращаемому значению функции. В этом случае это недействительно, поэтому это не имеет большого смысла. На самом деле, нет смысла возвращаться по летучивому значению *. Летучий тип возврата будет иметь смысл только для справки:

volatile int& foo() { ... } 
volatile int& i = foo(); // OK 
int j = foo(); // OK, use the volatile reference to construct a non volatile int 
int& j = foo(); // Error! 

Во втором случае, это означает, что метод volatile, следовательно, он может быть вызван (Неконстантный) энергонезависимая и летучее экземпляры класса Test. Аналогичный метод без квалификатора volatile не мог быть вызван на экземпляр volatile.

Test test0; 
test0.testMe(); // OK 
volatile Test test1; 
test1.testMe(); // OK 
test1.someNonVolatileMethod(); // Error. 

* Если это значение не является указателем

+0

Он также может иметь смысл возвращать тип летучий класса по значению, так что только летучие функции-члены могут быть вызваны на временной. Я не говорю, что я когда-либо видел это, но это кажется разумным. –

+0

@ edA-qamort-ora-y Я должен серьезно подумать об этом. Я предполагаю, что вы определили случай, когда он отличается от 'const', где возвращаемое значение' const' испортило бы семантику перемещения. – juanchopanza

3

Те же правила, которые относятся к const, относятся к volatile.

При возврате void (скорее не возвращается) volatile бесполезен в первом фрагменте.

Второй фрагмент отмечает весь метод как volatile.

Например, если у вас есть:

volatile Test m; 
m.testMe(); 

только компилирует является testMe помечается как volatile (как ваш второй код).

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