メソッド宣言での「volatile」キーワードの配置は、その機能に影響しますか?
つまり、次の 2 つのコードに違いはありますか?
A.
class Test
{
public:
volatile void testMe()
{
}
};
B.
class Test
{
public:
void testMe() volatile
{
}
};
メンバー関数に戻り値がある場合も同様です。ありがとうございました!
メソッド宣言での「volatile」キーワードの配置は、その機能に影響しますか?
つまり、次の 2 つのコードに違いはありますか?
A.
class Test
{
public:
volatile void testMe()
{
}
};
B.
class Test
{
public:
void testMe() volatile
{
}
};
メンバー関数に戻り値がある場合も同様です。ありがとうございました!
const
予選と同じです。
最初の例でvolatile
は、関数の戻り値に適用されます。この場合は無効なので、あまり意味がありません。実際、 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!
2 番目のケースでは、メソッドが であることを意味するvolatile
ため、クラス の (非 const) 不揮発性および揮発性インスタンスで呼び出すことができますTest
。修飾子のない同様のメソッドは、インスタンスvolatile
で呼び出すことができませんでした。volatile
Test test0;
test0.testMe(); // OK
volatile Test test1;
test1.testMe(); // OK
test1.someNonVolatileMethod(); // Error.
*その値がポインタでない限り
に適用されるのと同じルールが適用されconst
ますvolatile
。
戻るときvoid
(むしろ返さない)volatile
は、最初のスニペットでは役に立ちません。
2 番目のスニペットは、メソッド全体を としてマークしvolatile
ます。
たとえば、次の場合:
volatile Test m;
m.testMe();
コンパイルのみtestMe
がマークされていvolatile
ます(2番目のコードのように)。