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

Lib*_*sik 14 c++ gcc volatile

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

volatile int i{100};
int j{200};
std::cout << std::min(i, j);
Run Code Online (Sandbox Code Playgroud)

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

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

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

std::min(int(i), j);
Run Code Online (Sandbox Code Playgroud)

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

Bat*_*eba 23

volatile是一个限定符就像const.它不仅仅是对编译器的暗示.

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

由于你被允许引入资格赛,你可以沉迷于一点点手握和写作

std::min<volatile int>(i, j)
Run Code Online (Sandbox Code Playgroud)


Sto*_*ica 12

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

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

std::cout << std::min({i, j});
Run Code Online (Sandbox Code Playgroud)

请记住,它执行副本,不接受或返回引用.

  • @Bathsheba - `std :: min <volatile int>`另一方面可以工作.虽然它让*me*puke. (3认同)