揮発性はconstのようにオーバーロードの要因であると聞きました。
関数がvolatileパラメーターによってオーバーロードされている場合、volatile-versionはいつ呼び出されますか?
volatile-versionが呼び出される状況は想像できません。
揮発性はconstのようにオーバーロードの要因であると聞きました。
関数がvolatileパラメーターによってオーバーロードされている場合、volatile-versionはいつ呼び出されますか?
volatile-versionが呼び出される状況は想像できません。
次に例を示します。
#include <iostream>
struct A {
void foo() {
std::cout << "in non-volatile" << std::endl;
}
void foo() volatile {
std::cout << "in volatile" << std::endl;
}
};
int main()
{
A a;
a.foo();
volatile A b;
b.foo();
}
b.foo()
オーバーロードを呼び出しますvolatile
。struct A
の揮発性オーバーロードがなかった場合foo
、b.foo()
は無効になります。
揮発性はパラメーターに適用できますが、パラメーターに直接適用した場合、オーバーロードの要因にはなりません。ただし、これを使用してパラメータのタイプを区別することは可能です。たとえば、これは合法です。
void f(int &p) {}; //reference to int
void f(volatile int &p) {}; //reference to volatile int
これではありません:
void f(int p) {};
void f(volatile int p) {};
その理由は、最初の例では、参照が揮発性のものではなく、整数であるためです。2番目の例では、両方のタイプが整数であるため、同じタイプです。
揮発性の方法もあります。それらはthis
、揮発性であると宣言することに似ています。はポインタであり、包含型自体ではないためthis
、以下も有効です。
void c::f(int p) {};
void c::f(int p) volatile {};
によるオーバーロードの場合とすべて同じconst
です。
C ++標準のこの関連部分は、§13.1オーバーロード可能な宣言です。C ++ 11ドラフトn3290から:
constおよび/またはvolatileの有無のみが異なるパラメーター宣言は同等です。つまり、どの関数が宣言、定義、または呼び出されているかを判別するときに、各パラメーター型のconstおよびvolatile型指定子は無視されます。[ 例:
typedef const int cInt;
int f(int);
int f(const int); // redeclaration of f(int)
int f(int) { /* ... */ } // definition of f(int)
int f(cInt) { /* ... */ } // error: redefinition of f(int)
—終了例]
この方法では、パラメーター型指定の最も外側のレベルにあるconstおよびvolatile型指定子のみが無視されます。パラメータ型指定内に埋め込まれたconstおよびvolatile型指定子は重要であり、オーバーロードされた関数宣言を区別するために使用できます124。特に、任意のタイプTの場合、、、、およびは、、、、およびと同様
pointer to T
に、別個のパラメータータイプと見なされます。pointer to const T
pointer to volatile T
reference to T
reference to const T
reference to volatile T
124)関数へのポインタであるパラメータ型の場合のように、パラメータ型に関数型が含まれる場合、内部関数型のパラメータ型仕様の最外部レベルにあるconstおよびvolatile型指定子も無視されます。
調べるためのテストプログラムを作成します。
void func(const int& a)
{
std::cout << "func(const)" << std::endl;
}
void func(const volatile int& a)
{
std::cout << "func(const volatile)" << std::endl;
}
int main()
{
const int a = 0;
const volatile int b = 0;
func(a);
func(b);
system("pause");
return 0;
}
出力します:
func(const)
func(const volatile)