11

揮発性はconstのようにオーバーロードの要因であると聞きました。

関数がvolatileパラメーターによってオーバーロードされている場合、volatile-versionはいつ呼び出されますか?

volatile-versionが呼び出される状況は想像できません。 

4

3 に答える 3

10

次に例を示します。

#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()オーバーロードを呼び出しますvolatilestruct Aの揮発性オーバーロードがなかった場合foob.foo()は無効になります。

于 2012-04-20T08:20:01.380 に答える
8

揮発性はパラメーターに適用できますが、パラメーターに直接適用した場合、オーバーロードの要因にはなりません。ただし、これを使用してパラメータのタイプを区別することは可能です。たとえば、これは合法です。

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 Tpointer to volatile Treference to Treference to const Treference to volatile T

124)関数へのポインタであるパラメータ型の場合のように、パラメータ型に関数型が含まれる場合、内部関数型のパラメータ型仕様の最外部レベルにあるconstおよびvolatile型指定子も無視されます。

于 2012-04-20T08:21:07.323 に答える
3

調べるためのテストプログラムを作成します。

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)
于 2012-04-20T08:22:10.997 に答える