为什么volatile不能用std :: min编译

时间:2017-11-28 11:58:29

标签: c++ gcc volatile

为什么以下代码无法编译(gcc-5.4.0)?

jest.mock('./api');
import {getUsers} from "./api";

test("user list is an array", async () => {
    expect.assertions(1);
    const resp = await getUsers();
    expect(Array.isArray(resp)).toBe(true);
});

我的意思是我看到了编译错误:

  

错误:没有匹配函数来调用'min(volatile int&,int&)'

不是volatile只是提示编译器,变量可能会从程序外部改变吗?

volatile int i{100};
int j{200};
std::cout << std::min(i, j);

当然有效。但是不应该原创作品吗?

2 个答案:

答案 0 :(得分:23)

volatile限定符,就像const一样。它不仅仅是对编译器的暗示。

std::min期望这两个参数具有完全相同的类型和限定符。因此,在您的情况下,它会发出诊断信息。

由于你被允许介绍限定符,你可以沉迷于一点点手持并写下

std::min<volatile int>(i, j)

答案 1 :(得分:12)

正如@Bathsheba指出的那样,对两个参数的类型推导必须给出相同的类型。

但为了完整性,std::min也被重载以接受std::initializer_list。它的元素受复制初始化的影响,因此顶级cv限定符并不重要。所以这将有效:

std::cout << std::min({i, j});

请记住,它会执行复制,并且不接受或返回引用。