2012-04-20 53 views
10

我听说volatile是const的重载因素。易失性超载?

如果一个函数被volatile参数重载, when是什么时候volatile的版本被调用?

我无法想象当调用volatile版本时的情况。  

+0

添加C++标签;如果这不是你正在谈论的语言,请编辑你的问题以提及相当重要的事实并适当地重新标记。 – Mat 2012-04-20 08:17:17

+2

这与'const'类似,如果你有一个'volatile'限定对象,那么只能调用'volatile'函数。 – 2012-04-20 08:19:48

+1

哦,我滑了我的脑海 – 2012-04-20 08:25:53

回答

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和volatile类型说明符以这种方式被忽略;隐藏在参数类型规范中的const和volatile类型说明符是重要的,可用于区分重载函数声明。特别地,对于任何类型的T,pointer to Tpointer to const T,和pointer to volatile T被认为是不同的参数类型,因为是reference to Treference to const T,和reference to volatile T

124)当参数类型包括功能类型,例如在参数类型的情况下是一个指向功能, const和volatile类型说明符在参数类型规格的用于最外层平内部功能类型 也被忽略。

+0

这是一个很好的答案 – Pete 2012-04-20 12:43:40

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()将调用volatile超载。如果struct A对于foo没有易失性过载,则b.foo()将无效。

+0

没那么快。这个问题似乎是关于易失性参数,而这些不是超载的一个因素。 – 2012-04-20 08:51:43

+0

这并不完全清楚 - 皮特已经发布了关于函数参数的答案。 – Mat 2012-04-20 08:55:05

+0

我很好,但@Pete也没有给出完整的答案。也许我们应该巩固。 – 2012-04-20 09:29:50

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)