メソッド宣言での「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番目のコードのように)。