2012-04-20 4 views
10

휘발성이 const와 같은 오버로드 요소라는 이야기를 들었습니다.휘발성 과부하?

휘발성 매개 변수로 함수가 오버로드 된 경우 휘발성 버전은 언제 호출됩니까?

휘발성 버전이 호출 된 상황을 상상할 수 없습니다.

#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 오버로드를 호출합니다 :  

+0

추가 된 C++ 태그; 그것이 당신이 말하는 언어가 아닌 경우 질문을 편집하여 오히려 중요한 사실을 언급하고 적절하게 다시 태그하십시오. – Mat

+2

이것은'const'와 비슷합니다. 만약 당신이'volatile' 수식 된 객체를 가지고 있다면'volatile' 함수 만 호출 할 수 있습니다. –

+1

오, 나는 내 마음을 미끄러졌습니다. –

답변

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) {}; 

이유는 첫 번째 예제에서 참조가 휘발성하지 것입니다,하지만 정수이다. 두 번째 예에서 두 유형 모두 정수이며 따라서 동일한 유형입니다.

또한 휘발성 방법이 있습니다. 그들은 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 휘발성 타입 지시자는 이러한 방식으로 무시된다; 매개 변수 유형 사양에 포함 된 const 및 volatile 유형 지정자는 중요하며 오버로드 된 함수 선언을 구별하는 데 사용할 수 있습니다 . 특히, 어떤 유형 T에 대해서도 , reference to const Treference to volatile T과 같이 pointer to T, pointer to const Tpointer to volatile T이 별개 매개 변수 유형으로 간주됩니다.

124) 매개 변수 유형에 함수 포인터가있는 경우와 같이 함수 유형에 대한 매개 변수 유형 사양의 최 외각에있는 const 및 volatile 유형 지정자 내부 함수 유형은 도 무시됩니다.

+0

좋은 답변입니다. – Pete

10

다음은 예입니다. struct Afoo의 휘발성 오버로드가없는 경우 b.foo()은 유효하지 않습니다.

+0

너무 빠르지. 이 질문은 휘발성 매개 변수에 관한 것으로 보이며 오버로드 요인이 아닙니다. –

+0

그것은 완전히 명확하지 않았습니다. 그리고 Pete는 이미 함수 매개 변수에 대한 답을 게시했습니다. – Mat

+0

나는 괜찮아요.하지만 @Pete도 완전한 대답을하지 못합니다. 어쩌면 우리는 공고해야합니다. –

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)