易变超载?

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()则无效.


Jir*_*ika 8

易失性可以应用于参数,但直接应用于参数时不是过载的因素.然而,可以使用它来区分参数的类型.例如,这是合法的:

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 Tpointer to volatile T被认为是不同的参数类型,因为是reference to T,reference to const T,和reference to volatile T.

124)当参数类型包括函数类型时,例如在作为函数指针的参数类型的情况下,内部函数类型的参数类型规范的最外层的const和volatile类型说明符也是忽略.