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

Why is volatile not compiling with std::min

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

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

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

error: no matching function for call to ‘min(volatile int&, int&)’

volatile 不只是向编译器提示变量可以从程序外部更改吗?

std::min(int(i), j);

当然有效。但原创作品不也应该如此吗?

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

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

既然你被允许引入限定词,你可以手把手地写

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

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

但为了完整起见,std::min 也被重载以接受一个 std::initializer_list。它的元素受复制初始化的影响,因此顶级 cv 限定符是无关紧要的。所以这会起作用:

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

请记住,它执行复制,不接受或 return 引用。