Gim*_*Eom 10 c++ overloading volatile
我听说volatile是像const这样的重载因素.
如果一个函数被volatile参数重载,那么什么时候调用volatile-version?
我无法想象调用volatile-version时的情况.
Mat*_*Mat 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();
}
Run Code Online (Sandbox Code Playgroud)
b.foo()会调用volatile过载.如果struct A没有volatile的重载foo,b.foo()则无效.
易失性可以应用于参数,但直接应用于参数时不是过载的因素.然而,可以使用它来区分参数的类型.例如,这是合法的:
void f(int &p) {}; //reference to int
void f(volatile int &p) {}; //reference to volatile int
Run Code Online (Sandbox Code Playgroud)
这不是:
void f(int p) {};
void f(volatile int p) {};
Run Code Online (Sandbox Code Playgroud)
原因是在第一个例子中,引用不是volatile,而是整数.在第二个示例中,两种类型都是整数,因此是相同的类型.
还有一些不稳定的方法.它们类似于宣称this是不稳定的.因为this是一个指针而不是包含类型本身,以下内容也是合法的:
void c::f(int p) {};
void c::f(int p) volatile {};
Run Code Online (Sandbox Code Playgroud)
它与重载相同const.
C++标准的相关部分是§13.1可重载声明.来自C++ 11 draft 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)
Run Code Online (Sandbox Code Playgroud)
- 结束例子]
仅以这种方式忽略参数类型规范最外层的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类型说明符也是忽略.
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |